【问题标题】:I have a question about initializing the provider inside a function outside the 'Widget build(BuildContext context) {}.'我有一个关于在 'Widget build(BuildContext context) {} 之外的函数内初始化提供程序的问题。
【发布时间】:2021-02-28 12:17:38
【问题描述】:

您好,我有一个小部件构建(BuildContext 上下文){}。'我尝试在外部初始化提供程序并使用它,但出现以下错误:


试图从小部件树的外部侦听提供者公开的值。

这可能是由调用的事件处理程序(如按钮的 onPressed)引起的 Provider.of 不通过listen: false

要修复,请编写: Provider.of(context, listen: false);

它不受支持,因为可能会毫无意义地重建与 事件处理程序,当小部件树不关心值时。

使用的上下文是:LoginSelectPage(dependencies: [MediaQuery], state: _LoginSelectPageState#0e08d)


@override
  void initState() {
    // TODO: implement initState
    //registrationBloc = BlocProvider.of<RegistrationBloc>(context);
    super.initState();
    (() async {
      final SharedPreferences prefs = await SharedPreferences.getInstance();
      bool res = prefs.getBool('autoLoginKey');

      SocketProvider provider = Provider.of<SocketProvider>(context);//This is where it matters.
}

在这种情况下,我们如何初始化提供程序以使用它?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以在 didChangeDependencies 方法中使用您的提供程序。此方法也在 initState 之后立即调用,并且可以访问 BuildContext。

    @override
      void didChangeDependencies() {
        SocketProvider provider = Provider.of<SocketProvider>(context);
    
        super.didChangeDependencies();
    }
    

    【讨论】:

    • 非常感谢您的建议!
    【解决方案2】:

    您可以在构建方法中设置提供程序:

    @override
      Widget build(BuildContext context) {
        SocketProvider provider = Provider.of<SocketProvider>(context);
        //Your code goes here   
    }
    

    或按照控制台的说明操作,并将“listen: false”添加到您的提供者:

    @override
    void initState(){
      SocketProvider provider = Provider.of<SocketProvider>(context, listen: false);
      //Your code
      super.initState();
    }
    

    【讨论】:

    • 非常感谢您,非常感谢您
    猜你喜欢
    • 2021-02-24
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    相关资源
    最近更新 更多