一直使用provider做状态管理,看了下源码,简单化的做个状态管理更新,可以适用于Theme切换,货币切换,语言切换等
效果
Screen_recording_20240830_142539.gif
创建一个StateContainer文件,保存你所需要修改的所有数据
import 'package:flutter/material.dart';
import 'package:test/theme/themes.dart';
class _InheritedStateContainer extends InheritedWidget {
final StateContainerState data;
const _InheritedStateContainer(
{Key? key, required this.data, required Widget child})
: super(key: key, child: child);
@override
bool updateShouldNotify(covariant InheritedWidget oldWidget) {
// TODO: implement updateShouldNotify
return true;
}
}
class StateContainer extends StatefulWidget {
final Widget child;
const StateContainer({super.key, required this.child});
static StateContainerState of(BuildContext context) => context.dependOnInheritedWidgetOfExactType<_InheritedStateContainer>()!.data;
@override
State<StatefulWidget> createState() => StateContainerState();
}
class StateContainerState extends State<StateContainer> {
int count = 0;
updateCount(int cou){
count = cou;
setState(() {
});
}
BaseTheme curTheme = LightTheme();
updateTheme(bool isNight){
curTheme = isNight ? NightTheme() : LightTheme();
setState(() {
});
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return _InheritedStateContainer(data: this, child: widget.child);
}
}
创建theme值管理文件
import 'package:flutter/material.dart';
abstract class BaseTheme{
bool isDark = false;
Color? backGroundColor;
Color? titleColor;
}
class LightTheme extends BaseTheme{
@override
Color? backGroundColor = Colors.black;
@override
// TODO: implement titleColor
Color? get titleColor => Colors.white;
}
class NightTheme extends BaseTheme{
@override
Color? backGroundColor = Colors.blue;
@override
// TODO: implement titleColor
Color? get titleColor => Colors.black;
}
具体的页面
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:test/theme/appstate_container.dart';
class ThemeTestPage extends StatefulWidget {
const ThemeTestPage({super.key});
@override
State<StatefulWidget> createState() {
return ThemeTestPageState();
}
}
class ThemeTestPageState extends State<ThemeTestPage> {
int index = 0;
late Timer _time;
@override
void initState() {
// TODO: implement initState
super.initState();
_time = Timer.periodic(const Duration(seconds: 3), (timer) {
StateContainer.of(context).updateCount(index++);
StateContainer.of(context).updateTheme(index % 2 == 0);
});
}
@override
Widget build(BuildContext context) {
final count = StateContainer.of(context).count;
// TODO: implement build
return Scaffold(
appBar: AppBar(),
body: Container(
color: StateContainer.of(context).curTheme.backGroundColor,
child: Center(
child: Text(
'当前数字$count',
style: TextStyle(
color: StateContainer.of(context).curTheme.titleColor,
fontSize: 16),
),
),
),
);
}
@override
void dispose() {
super.dispose();
_time.cancel();
}
}