单视图颤振的提供者

时间:2020-02-23 02:17:28

标签: flutter dart flutter-provider

我正在为Flutter使用provider软件包。我要实现的是为一个视图或页面提供一个简单的提供程序。因此,我在小部件中尝试了以下操作:

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

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

在此MyPageWidget上方找不到正确的提供程序

当我将提供程序的声明移动到在此小部件上方声明我的App的位置时,它将起作用。不幸的是,这使提供商公开供我访问所有我不想要的视图。我该如何创建一个可以在该视图或窗口小部件中访问的提供程序。感谢您的帮助。


注意:我尝试过此answer,但仍得到相同的结果。

编辑:我可以在小部件树的顶部使用Consumer,但是如果我的整个小部件树都在{中,那不会导致页面重建过多{1}}。此外,如果我需要使用Consumer,怎么办?

2 个答案:

答案 0 :(得分:1)

尝试用消费者包裹支架

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

现在您可以通过将其传递给方法来直接访问我的模型

答案 1 :(得分:0)

我终于找到了解决此问题的方法,该方法不需要在发生类似@ GJJ2019 answer的更改时重建整个窗口小部件树。当我声明路线时,例如:

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

例如,我用MyScreen包装ChangeNotifierProvider

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

因此,与其在小部件/屏幕中声明正在使用的提供程序,不如在声明路由的地方声明提供程序。