美文网首页
Flutter异步使用Steam监听

Flutter异步使用Steam监听

作者: 旺仔_100 | 来源:发表于2021-08-30 20:52 被阅读0次

    一、关于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}");
          });
        });
    
    

    相关文章

      网友评论

          本文标题:Flutter异步使用Steam监听

          本文链接:https://www.haomeiwen.com/subject/clgoiltx.html