Provider簡(jiǎn)單使用

  • Provider只暴露值,不觸發(fā)任何rebuild(不會(huì)通知監(jiān)聽(tīng)者),對(duì)于Providercontext.read()context.watch()沒(méi)有什么區(qū)別。
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}');
      },
    );
  }
  • 如果需要監(jiān)聽(tīng)值的改變,使用ChangeNotifierProvider,并在其builder中使用值的地方使用context.watch()獲取值。如果使用context.read(),值改變不會(huì)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會(huì)創(chuàng)建新的Listenable對(duì)象,在當(dāng)前節(jié)點(diǎn)被移除時(shí),這個(gè)對(duì)象也會(huì)被銷毀。

  • 如果你的Listenable對(duì)象需要在節(jié)點(diǎn)被移除時(shí)依然存在不被銷毀,那么使用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中的內(nèi)容足夠少,那么每次值改變后rebuild的內(nèi)容越少。但如果讀取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),
            ),
          ],
        );
      },
    );
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容