记录:Flutter Provider 泛型不刷新问题

错误回顾

由于项目封装,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();
            },
          );
        },
      ),
    );
  }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值