【问题标题】:How can i call my provider model into initState method我如何将我的提供者模型调用到 initState 方法中
【发布时间】:2022-10-21 21:21:41
【问题描述】:

我有几个小部件使用我的提供者作为条件,我需要一个调用来从初始化状态访问我的提供者到整个小部件,而不是将每个小部件包装到我的提供者中,它是consumer

这是我的provider

class ProviderForFiltter extends ChangeNotifier {
  bool isFiltterrr = true ;

  bool get isFiltter => isFiltterrr;

  void changeStatus(bool status){
    isFiltterrr = status;
    notifyListeners();
  }
}

这是我的main.dart

class Myproject extends StatefulWidget {
  const Myproject ({Key? key}) : super(key: key);

  @override
  _Myproject State createState() => _Myproject State();
}

class _Myproject State extends State<Myproject > {



  @override
  Widget build(BuildContext context) {
    return  
      
          Provider(
               create: (BuildContext context) {
                return ProviderForFiltter();
               },
               child: const MaterialApp(
                  debugShowCheckedModeBanner: false,

                  home: WelcomeScreen()


            ),
             ),

    );
  }
}

这是我的Stful 小部件

ProviderForFiltter? isF ;
 @override
  void initState() {
    super.initState();
     // i tried this but it always give me errors that is isF  null value
     WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
      isF = context.read<ProviderForFiltter>();
    }); 
       // also itried this but it don't work 
    isF = Provider.of<ProviderForFiltter>(context, listen: false);
  }

  @override
  Widget build(BuildContext context) {




    return Scaffold(
      body: Text('change'),
    )

  }

}

事实上我需要使用它的布尔值作为消费者的条件并改变它

我希望对大家有帮助

【问题讨论】:

  • 您是否尝试过pub.dev/packages/provider 页面中的I have an exception when obtaining Providers inside initState. What can I do? 部分?

标签: flutter dart provider


【解决方案1】:

最好不要在 initState 中使用 Provider,但你可以使用 Future.delayed 因为你需要上下文



@override
  void initState() {
    super.initState();
     // i tried this but it always give me errors that is isF  null value

   Future.delayed(Duration(seconds: 1), () {
  
     WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
      isF = context.read<ProviderForFiltter>();
    }); 
       // also itried this but it don't work 
    isF = Provider.of<ProviderForFiltter>(context, listen: false);
   });
  }

【讨论】:

  • 谢谢,但你认为这段代码值得回答吗? 1000秒真的像吗?以及您提到的确切代码,因为我不知道代码到底是什么
  • 您的提供商代码
  • 你能帮我删除答案吗,因为没有人会等待 1000 秒,除此之外它也没有用,非常感谢你试图帮助 Javad
【解决方案2】:

供应商需要语境,为了访问它一次,你应该覆盖didChangeDependencies

 @override
  void didChangeDependencies() {
    super.didChangeDependencies();
   ///access provider here and update your state if needed,
   ///this will be called one time just before the build method
     **isF = Provider.of<ProviderForFiltter>(context, listen: false);**
  }

【讨论】:

    【解决方案3】:

    有多种方法可以解决这个问题。

    我使用的第一个选项是添加一个 Post Frame 回调,如下所示:

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      aProvider = Provider.of< aProvider >(context, listen: false);
    });
    

    或者,您可以覆盖 didChangeDependencies 方法以在调用 initState 后获取提供程序值 - 记住将侦听值设置为 false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-09
      • 2018-08-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 2021-10-29
      • 2018-09-05
      • 1970-01-01
      相关资源
      最近更新 更多