【问题标题】:What is the purpose of child in Consumer Provider FlutterConsumer Provider Flutter中child的目的是什么
【发布时间】:2020-02-18 20:01:17
【问题描述】:

我有一个关于 Flutter 中 Provider 包的 Consumer 的问题。 我不明白 Consumer 构建器中参数“child”的目的

Consumer<MyModel>(builder: (context, myModel, child) {
// doing stuff using myModel variable
});

我找不到任何关于它的文档。

【问题讨论】:

    标签: flutter provider


    【解决方案1】:

    子是任何不需要提供程序内部数据的小部件,因此当数据更新时,它们不会重新创建,因为它们不需要数据,而是作为参考建造者。

    
        Consumer(
           builder: (context, myModel, child) {
           // child will refer to the MaterialButton provided as the child argument in the 
           // Consumer named parameter,
           // doing stuff using myModel variable
           }
           child: MaterialButton( 
                  child: Text("Do some action"), 
                  onPressed: () {
                  // do some actions
        },),);
    

    由于 MaterialButton 不需要提供程序的状态,但它在后代树中,因此无需重新渲染它,因此将其传递回构建器,以节省内存并提高性能

    【讨论】:

    • 但是,这将如何在屏幕上布局?它会是水平的还是垂直的或更多......我们将一个小部件返回给构建器并将一个小部件返回给孩子,那么flutter将如何布局它们?
    • 它是可选的,如果你需要它显示它,否则你可以省略孩子
    • @ChinkySight 我也有同样的问题。我认为答案是它首先尝试使用构建器小部件,但如果没有构建器小部件,那么它会退回到子级?
    • @MobileMon 不是这样的,因为我们知道我们可以使用 Provider 来进行依赖注入和状态管理。如果ConsumerChangeNotifierProvider 类型,并且在调用notifyListener() 时我们没有要重建的特定小部件,那么我们可以使用child 属性。
    • 这是从缓存中返回相同的材质按钮实例吗?
    【解决方案2】:

    您可以在消费者中传递子小部件。当数据更改时,您作为孩子传递的任何小部件都不会重建。

    您可以避免使用子组件进行不必要的小部件重建。

    【讨论】:

    • 但是,这将如何在屏幕上布局?它会是水平的还是垂直的或更多......我们将一个小部件返回给构建器并将一个小部件返回给孩子,那么flutter将如何布局它们?
    • 如果您在其中粘贴代码,您将获得与子小部件相同的行为。 @ChinkySight
    • 这里还有一个问题:我有一个由ScaffoldAppBarColumn 组成的小部件树。 Column 包含三个小部件:TextFuture BuilderFlat Button。我想在提供者的状态发生变化时重建所有东西(AppBar, Column ..),Future Builder 除外(否则它将执行不必要的读取)。
    • 那么你必须将消费者包裹在脚手架之上,并将未来的构建者分配给孩子,并在你想在文本和平面按钮之间使用的任何地方使用孩子。
    • 现在我知道了,孩子是如何工作的,非常感谢:D
    猜你喜欢
    • 2020-11-29
    • 2022-12-04
    • 2022-10-14
    • 2021-06-12
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2021-03-03
    • 2019-05-31
    相关资源
    最近更新 更多