【问题标题】:using Provider to avoid rebuild all widget tree in flutter使用 Provider 避免在颤动中重建所有小部件树
【发布时间】:2020-12-15 04:01:00
【问题描述】:

据我了解,Provider 的好处之一是通过调用 build 函数来避免重建小部件树,但是当我用这个简单的例子实际尝试时:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:providerexamplelast/counterWidget.dart';

void main() => runApp(ChangeNotifierProvider<Provider1>(
  create: (_) => Provider1(),
  child:   MaterialApp(
    home: Counter(),
  ),
));

int n =0;
class Counter extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print("${n++}");
var counter = Provider.of<Provider1>(context);
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: ()=> counter.counter(),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("1"),
            SizedBox(height: 5,),
            countText(),
            SizedBox(height: 5,),
            Text("3"),
            SizedBox(height: 5,),
            Text("4"),

          ],
        ),
      ),
    );
  }
}

Widget countText(){
  return Builder(
    builder: (context){
      var count = Provider.of<Provider1>(context);
      return Text("${count.c}");
    },
  );
} 

通过使用这部分:

print("${n++}");

我注意到,每当我按下按钮并从提供程序调用(计数器)函数时,(构建)函数就会被调用?

所以这里的问题只是(无状态)小部件,它如何再次重建?那么为什么我需要使用Provider,如果它不能解决这个问题呢?

编辑:我听说过这种方式:

var counter = Provider.of<Provider1>(context, listen: false);

那么它解决了这个问题吗?以及如何?

【问题讨论】:

    标签: flutter state provider stateful listen


    【解决方案1】:
    var counter = Provider.of<Provider1>(context, listen: false);
    

    Provider 是 Fl​​utter 的一种状态管理机制,在底层,Provider 会跟踪小部件内部所做的更改。 ProviderStateless 小部件还是 Stateful 小部件都无所谓,如果有任何变化,它将重新构建小部件。

    listen: false 告诉Provider 即使数据被修改也不重建小部件。

    【讨论】:

    • 感谢您的回复,但如果它告诉它不要重建小部件,那么为什么在我的示例中它是有效的,(countText())即使我听了也会再次重建:假?
    • 您是否将listen:false 添加到两个使用的提供者引用中,例如Provider.of(context, listen: false)
    • 是的,我也尝试过,同样的事情,但实际上 (build) 函数可能不记得,因为我没有看到 (n) 变量增加,但我想知道,什么是听:假的吗?
    • 我已经在我的答案中添加了它的作用,我不确定,但添加后它不会再次重新触发构建方法,这意味着你没有问题。
    • 当我将 countText() 函数更改为 StatelessWidget 并进行监听时:false,没有发生任何事情,这意味着构建函数不会重新调用,所以谢谢,我想我不明白
    猜你喜欢
    • 2020-10-18
    • 2020-06-14
    • 2021-04-03
    • 2020-09-07
    • 2021-01-19
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2021-11-01
    相关资源
    最近更新 更多