我们在上一章回中介绍了使用InheritedWidget组件共享数据的方法,不过这种共享只限于父组件与子组件之间。本章回中将介绍一种全局共享数据的方式,这里说的
全局是指在任意组件之间。我们需要借助provider包实现全局数据共享功能,本章回中将详细介绍这方面的内容。此外,这种共享数据的方式也叫状态管理,因为在
Flutter中更新数据都是通过更新状态实现的,类似StatefulWidget组件中的通过setState()方法更新组件状态。
我们首先介绍provider包,明白包中的内容后再介绍实现共享数据的方法,provider包提供了相关的类来实现数据共享功能,主要包含5个类,下面是它们的详细功能:
///创建数据共享类,需要继承ChangeNotifier类,使用类中的notifyListeners()方法通知:数据有更新
class ViewModel extends ChangeNotifier {
late String _data;
ViewModel() {
_data = 'init data';
}
String get getData {
print('data is gotten at getter');
return _data;
}
set setData(String value) {
print('data is changed to \'$value\'at setter');
_data = value;
///当数据更新时通知更新UI
notifyListeners();
}
}
///在整个应用的顶层设置Notifier,
///在整个应用的任何位置都可以使用viewModel中共享的数据
runApp(
ChangeNotifierProvider(
create:(context) => ViewModel(),
child: const FlutterCookbookApp(),
)
);
上面的代码中演示了数据共享类的实现和ChangeNotifierProvier类的实现,这里需要注意的是ChangeNotifierProvier类的实现,通常会把顶层的widget赋值
给该类的child属性,也就是把数据共享类和顶层的Widget绑定在一起,Flutter中的Widget是以树的形式进行管理,顶级widget相当于树根,如果把树根和数据共
享类绑定到一起,那么整棵树上任意的widget都可以获取共享数据。鉴于这个原理,我们通常把根widget和数据共享类绑定到一起,比如示例代码中就把整个项目的根
widget和数据共享类绑定到了一起,我们可以在项目中的任意Widget里获取共享数据。
provider包的内容比较抽象不好理解,因此我们对本章回的内容总结如下,以方便大家快速入门provider包相关的知识: