Provider简单使用

  • Provider只暴露值,不触发任何rebuild(不会通知监听者),对于Providercontext.read()context.watch()没有什么区别。
class MyModel {
  var num1 = 0;
  var num2 = 1;
}
// ...
  @override
  Widget build(BuildContext context) {
    return Provider(
      create: ((context) {
        return MyModel();
      }),
      builder: (context, child) {
        return Text('${context.read<MyModel>().num1} and ${context.read<MyModel>().num2}');
      },
    );
  }
  • 如果需要监听值的改变,使用ChangeNotifierProvider,并在其builder中使用值的地方使用context.watch()获取值。如果使用context.read(),值改变不会rebuild
class MyModel extends ChangeNotifier {
  var num1 = 0;
  var num2 = 1;
}
// ...
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: ((context) {
        return MyModel();
      }),
      builder: (context, child) {
        return Text('${context.watch<MyModel>().num1} and ${context.watch<MyModel>().num1}');
      },
    );
  }
  • ChangeNotifierProvider()create会创建新的Listenable对象,在当前节点被移除时,这个对象也会被销毁。

  • 如果你的Listenable对象需要在节点被移除时依然存在不被销毁,那么使用ChangeNotifierProvider.value()

  final model = MyModel();

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider.value(
      value: model,
      builder: (context, child) {
        return Text('${context.watch<MyModel>().num1} and ${context.watch<MyModel>().num1}');
      },
    );
  }
  • ChangeNotifierProvider为例,只要builder中的内容足够少,那么每次值改变后rebuild的内容越少。但如果读取ChangeNotifierProvidervalue的地方很多,但不希望这些地方都要rebuild,可以配合使用Consumer
class MyModel extends ChangeNotifier {
  var num1 = 0;
  var num2 = 1;

  addNum2() {
    num2++;
    notifyListeners();
  }
}
// ...
  final model = MyModel();
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider.value(
      value: model,
      builder: (context, child) {
        return Column(
          children: [
            Text('${context.read<MyModel>().num1}'),
            Consumer<MyModel>(builder: ((context, value, child) {
              return Text('${value.num2}');
            })),
            ElevatedButton(
              onPressed: () {
                model.addNum2();
              },
              child: const Icon(Icons.add),
            ),
          ],
        );
      },
    );
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容