1.分类及作用
- Provider 只可以获取值,不能更新值
- ListenableProvider 可以监听对象/组件,并且可以对组件进行重建
- ChangeNotifierProvider 继承ListenableProvider, 可以更新组件,并且可以自动执行ChangeNotifier.dispose,这也是和ListenableProvider的区别
- ValueListenableProvider 收听ValueListenable并且仅公开
ValueListenable.value
- StreamProvider 收听流,并公开发出的最新值。
- FutureProvider 接受Future值,并在Future完成时更新依赖项。
项目中常用的ChangeNotifierProvider,本章浅谈一下ChangeNotifierProvider如何做数据更新,和状态保存;
2.全局主题切换(暗黑模式)
-
依赖provider: ^4.1.3
-
建立主题model
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class ThemeViewModel extends ChangeNotifier{
ThemeType currentType;
ThemeData themeData;
///构造函数,初始化操作
ThemeViewModel(ThemeType type){
currentType = type;
if(currentType == ThemeType.dark){
themeData = ThemeData.dark();
}else{
themeData = ThemeData.light();
}
}
///取相反的状态
void reserve(){
if(currentType == ThemeType.dark){
_updateTheme(ThemeType.light);
}else{
_updateTheme(ThemeType.dark);
}
}
///更新主题
void _updateTheme(ThemeType type){
currentType = type;
if(type == ThemeType.dark){
themeData = ThemeData.dark();
}else{
themeData = ThemeData.light();
}
notifyListeners();
}
}
enum ThemeType{
light,
dark,
}
- 在mian.dart中设置默认值
runApp(ChangeNotifierProvider<ThemeViewModel>(
//设置默认值
create: (_)=>ThemeViewModel(ThemeType.light),
child: MyApp(),
),);
- 在MyApp的theme属性中用provider.of()来获取值
theme: Provider.of<ThemeViewModel>(context , listen: true).themeData,
- 1.建立model(设置属性,和修改主题的方法)-->2.注册(设置默认值)-->3.获取(默认/修改)的值-->修改值
修改主题值(通过consumer的builder方法去构建组件,ontap修改主题色)
InkWell(
child: Consumer<ThemeViewModel>(
builder: (_, viewModel , child){
return Icon(Icons.lightbulb_outline);
},
),
onTap:()=> Provider.of<ThemeViewModel>(context , listen: false).reserve()
),