在应用Provider的时候,次要关怀三个概念:

  • ChangeNotifier:真正数据(状态)寄存的中央
  • ChangeNotifierProvider:Widget树中提供数据(状态)的中央,会在其中创立对应的ChangeNotifier
  • Consumer:Widget树中须要应用数据(状态)的中央

代码:

import 'package:flutter/material.dart';import 'package:provider/provider.dart';void main() {  runApp(MyApp());}//^ 1. ChangeNotifier:真正数据(状态)寄存的中央//^ 2. ChangeNotifierProvider:Widget树中提供数据(状态)的中央,会在其中创立对应的ChangeNotifier//^ 3. Consumer:Widget树中须要应用数据(状态)的中央// ! 1. 创立ChangeNotifier,实际上就是咱们的状态,它不仅存储了咱们的数据模型,还蕴含了更改数据的办法,并暴露出它想要暴露出的数据class Counter with ChangeNotifier {  int _count = 0;  int get count => _count;  void increment() {    _count++;    notifyListeners();  }}class MyApp extends StatelessWidget {  // This widget is the root of your application.  @override  Widget build(BuildContext context) {    //! 2. ChangeNotifierProvider. 在Widget Tree中插入ChangeNotifierProvider,以便Consumer能够获取到数据    //创立顶层共享数据。这里应用MultiProvider能够创立多个共享数据,因为理论的利用不可能只有一个数据模型    return MultiProvider(      providers: [        ChangeNotifierProvider(create: (_) => Counter()),      ],      child: MaterialApp(        title: 'Flutter Demo',        home: FirstPage(),      ),    );  }}class FirstPage extends StatelessWidget {  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text("第一个页面"),        actions: <Widget>[          FlatButton(            child: Text("下一页"),            onPressed: () =>                Navigator.push(context, MaterialPageRoute(builder: (context) {              return SecondPage();            })),          ),        ],      ),      body: Center(        child: Consumer<Counter>(builder: (ctx, counterPro, child) {          return Text(            "以后计数:${counterPro.count}",            style: TextStyle(fontSize: 20, color: Colors.red),          );        }),      ),      //! 3. Consumer:Widget树中须要应用数据(状态)的中央      floatingActionButton: Consumer<Counter>(        builder: (ctx, counterPro, child) {          //* ctx: context,上下文,目标是晓得以后树的对象          //* counterPro: ChangeNotifier对应的实例,也是咱们在builder函数中次要应用的对象          //* child: 目标是进行优化,如果builder上面有一颗宏大的子树,当模型产生扭转的时候,咱们并不心愿从新build这颗子树,那么就能够将这颗子树放到Consumer的child中,在这里间接引入即可.          return FloatingActionButton(            child: child,            onPressed: () {              counterPro.increment();            },          );        },        child: Icon(Icons.add), //! Icon放在builder里面,避免每次跟着一起刷新      ),    );  }}class SecondPage extends StatelessWidget {  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text("第二个页面"),        actions: <Widget>[          FlatButton(            child: Text("上一页"),            onPressed: () =>                Navigator.push(context, MaterialPageRoute(builder: (context) {              return FirstPage();            })),          ),        ],      ),      body: Center(        child: Consumer<Counter>(builder: (ctx, counterPro, child) {          return Text(            "以后计数:${counterPro.count}",            style: TextStyle(fontSize: 20, color: Colors.red),          );        }),      ),      floatingActionButton: Consumer<Counter>(        builder: (ctx, counterPro, child) {          return FloatingActionButton(            child: child,            onPressed: () {              counterPro.increment();            },          );        },        child: Icon(Icons.add),      ),    );  }}


  • 参考文章
  • 官网文档

  • 简繁火星字体转换
  • 哄女友神器
  • 号码测吉凶
  • 电视节目直播表