错误回顾
由于项目封装,App外部还有一个ConfigApp类,App注册一个BaseConfig到Provider中.ConfigApp类中有BaseConfig的实现.
直接用BaseConfig的子类调用notifyListeners()刷新无效.
结构如下:
//一个单例
Global global = Global();
class ConfigApp<Config extends BaseConfig> {
...
Config appConfig;
_createApp(){
global.appConfig = appConfig;
runApp();
}
...
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
List<SingleChildWidget> providers = appConfig.providers;
//这里把config注册到Provider
providers.add(ChangeNotifierProvider.value(value: Global().appConfig));
return MultiProvider(
providers: providers,
child: Selector<BaseConfig, bool>(
selector: (context, value) => value.isEnablePreviewDevice,
builder: (context, data, child) {
return DevicePreview(
enabled: data,
builder: (context) {
return const MaterialApp();
},
);
},
),
);
}
}
然后子类AppConfig实现BaseConfig,刷新无效
解决办法
Provider监听是按照类型来的.
直接Global().appConfig获取到的类型是BaseConfig.而子类是AppConfig,所以通知不到
只需要把泛型传递一下,在注册的时候强转成子类类型,本身这里保存的也是BaseConig的实现
class MyApp<Config extends BaseConfig> extends StatelessWidget {
@override
Widget build(BuildContext context) {
List<SingleChildWidget> providers = appConfig.providers;
//这里把config类型强转一下
providers.add(ChangeNotifierProvider.value(value: Global().appConfig as Config));
return MultiProvider(
providers: providers,
//这里监听Config泛型类型
child: Selector<Config, bool>(
selector: (context, value) => value.isEnablePreviewDevice,
builder: (context, data, child) {
return DevicePreview(
enabled: data,
builder: (context) {
return const MaterialApp();
},
);
},
),
);
}
}