Flutter异步使用Steam监听

2021-08-30  本文已影响0人  旺仔_100

一、关于Stream,如果还不了解,可以看下我写过的 Flutter中的Stream

二、实际问题

写了个地址管理类,需要解析本地json。然后解析完之后才能去获取对应的省市区。这里就用到了Stream来监听解析。避免没有解析完成就开始获取省市区。


class AddressManager {
  static final AddressManager _instance = AddressManager._internal();
  AddressEntity? _bean;
  late Stream _stream;

  ///提供一个工厂方法来获取实例
  factory AddressManager() {
    return _instance;
  }

  ///通过私有方法 影藏构造方法 防止被误会创建
  AddressManager._internal() {
    ///初始化
    init();
  }

  void init()  {
    ///初始化  解析地址json

    Future<String> future = _getJson();
    future.then((value) {
      Map<String, dynamic> address = json.decode(value);
      print("解析json ${address.toString()}");
      _bean = AddressEntity().fromJson(address);
    });
    _stream = Stream.fromFuture(future);
  }

  Stream getSteam() {
    return _stream;
  }

  ///遍历初里面所有的 省
  List<AddressRECORDS?>? getProvince() {
    return _getBean("1");
  }

  ///遍历拿到里面所有的 市
  List<AddressRECORDS?>? getCity() {
    return _getBean("2");
  }

  ///遍历拿到里面所有的 区
  List<AddressRECORDS?>? getArea() {
    return _getBean("3");
  }

  List<AddressRECORDS?>? _getBean(String type) {
    if (_bean == null || _bean!.rECORDS == null) {
      return null;
    }
    return _bean!.rECORDS!.where((element) {
      return element.type == type;
    }).toList();
  }

  Future<String> _getJson() {
    return rootBundle
        .loadString("packages/plugin_mine/assets/data/p_city.json");
  }
}

三、使用的地方

    AddressManager().getSteam().listen((event) {
      AddressManager().getProvince()?.forEach((element) {
        print("省份  ===  ${element!.name}");
      });

      AddressManager().getCity()?.forEach((element) {
        print("城市  ===  ${element!.name}");
      });
      AddressManager().getArea()?.forEach((element) {
        print("区域  ===  ${element!.name}");
      });
    });

上一篇下一篇

猜你喜欢

热点阅读