单一视图 Flutter 的提供者

Provider for Single View Flutter

我正在使用 Flutter 的 provider 包。我想要完成的是只为一个视图或页面提供一个简单的提供程序。所以我在我的小部件中尝试了以下操作:

Widget build(BuildContext context) {
    return ChangeNotifierProvider<MyModel>(
      create: (_) => MyModel(),
      child: Scaffold(
        appBar: AppBar(
          title: Text(
            'Screen 1',
          ),
        ),
        body: _buildBody(),
      ),
    );
  }

但是当我尝试在我的 _buildBody() 方法中使用 Provider.of<MyModel>(context, listen: false).value 访问提供程序时,我收到错误消息:

Could not find the correct Provider above this MyPageWidget

当我将提供程序的声明移动到我在此小部件上方声明我的应用程序的位置时,它就可以工作了。不幸的是,这使得我所有视图的提供者 public 无法访问,这不是我想要的。我怎样才能制作一个只能在那个视图或小部件中访问的提供者。感谢您的帮助。


注意:我试过这个 但我仍然得到相同的结果。

编辑:我可以在小部件树的顶部使用 Consumer,但是如果我的整个小部件不会导致页面重建太多树在 Consumer 中。此外,如果我需要使用 Provider.of(...)?

怎么办?

尝试用消费者包装脚手架

Widget build(BuildContext context) {
return ChangeNotifierProvider<MyModel>(
  create: (_) => MyModel(),
  child: Consumer(
    builder: (context, MyModel model, _) => Scaffold(
      appBar: AppBar(
        title: Text(
          'Screen 1',
        ),
      ),
      body: _buildBody(),
    ),
  ));
}

现在你可以通过方法直接访问我的模型

我终于想出了一个解决方案,当像@GJJ2019 的答案那样发生变化时,不需要重建整个小部件树。当我声明路线时,例如:

'/': (context) => MyScreen();

我用 ChangeNotifierProvider 包装 MyScreen 例如:

'/': (context) => ChangeNotifierProvider<MyModel>(
  create: (_) => MyModel(),
  child: MyScreen()),

因此,与其在 widget/screen 中声明正在使用的提供者,不如在声明路由的地方声明提供者。