颤振状态管理问题

时间:2019-07-14 10:09:53

标签: firebase flutter bloc flutter-provider

我的问题与提供者模式/库有关。

我已经创建了一些状态类,如下所示(用替换的内容/变量名来保持简单)

class State1 with ChangeNotifier{

String _s;

  set s(String newS){
    _s = newS;
    notifyListeners();
  }

}

然后,我使用multiprovider传递它(在小部件init中创建对象,该对象充当应用程序中所有内容的父级。)

child: MultiProvider(
        providers: [
          ChangeNotifierProvider(builder: (context) => state1),
        ],
        child: Stack(
        alignment: Alignment.center,
        children: stackChildren,
      ),

然后使用

在子窗口小部件构建方法中访问哪个
 state1Var = Provider.of<State1>(context);

所有这些都很好。

我的问题是,当我开始使用导航推送时,我无法再访问该状态。

onPressed: (() {
          Navigator.push(
            contextField,
            MaterialPageRoute(builder: (context) => NewPage()),
          );
        }),

我收到此错误

Could not find the correct Provider<State1> above this NewPage Widget...

我确实设法用它

  Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Consumer(builder: (),child: NewPage(),)),
          );

但是当我使用navigator.pop()弹出窗口小部件时,无法使用该状态,因为它说它已经被丢弃了。我是做错了还是我错过了什么?

对不起,如果我把它弄复杂了。我不得不删除很多代码。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

可能您有一个context层次结构问题。将您的MaterialApp用MultiProvider包裹起来,否则您的Provider必须位于route的顶部,这样才能将提供商纳入其中。

或使用Consumer小部件包装您的脚手架。 Consumer的作用是,它只是在ProviderRoute之间建立连接的构建器。同样,由于Consumer小部件是Builder小部件,因此它还在各层之间也创建了context