【问题标题】:Provider for Single View Flutter单视图 Flutter 的提供者
【发布时间】:2020-06-07 01:31:07
【问题描述】:

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

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

但是当我尝试在我的_buildBody() 方法中使用Provider.of&lt;MyModel&gt;(context, listen: false).value 访问提供程序时,我得到了错误:

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

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


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

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

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案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(),
        ),
      ));
    }
    

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

    【讨论】:

    • 这似乎是一种迂回的方式来实现这一点,因为现在每次发生变化时都会重建整个小部件树,我必须将model 传递给每个函数。我试图在提供者中完成的事情是一种反模式,还是有更好的方法来做到这一点?
    • 当所有内容都被Consumer 包裹时,每次调用notifyListeners() 时,是否会重建整个小部件树?
    • 但如果我想从 initState() 或 didChangedependencies() 中的提供程序调用某些函数,则无法使用上述代码。
    【解决方案2】:

    我终于找到了一个解决方案,当像@GJJ2019 回答那样发生更改时,不需要重建整个小部件树。当我声明路由时,例如:

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

    我用ChangeNotifierProvider 包裹MyScreen 例如:

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

    因此,不要在正在使用的小部件/屏幕中声明提供程序,而是在声明路由的位置声明提供程序。

    【讨论】:

    • 所以,我明白了,我们应该把 Providers 放在应用程序的顶部,也就是说放在 Main.dart 中吧?
    猜你喜欢
    • 2020-05-01
    • 2021-01-19
    • 2022-01-12
    • 2021-09-23
    • 2020-03-22
    • 2020-10-16
    • 2020-04-29
    • 2013-02-06
    • 2020-04-23
    相关资源
    最近更新 更多