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