Flutter 如何使用bloc在颤振中切换主题?
我是新来的。我正在做一个应用程序与集团状态管理,可以改变作为系统主题的主题改变。现在它的工作很好,但我需要开关,可以覆盖的主题。我如何实现这一点?我通过观看youtube教程来制作这个应用程序。 不管怎样,这都是为了创建可以更改主题的开关 主题立体图Flutter 如何使用bloc在颤振中切换主题?,flutter,dart,bloc,flutter-bloc,cubit,Flutter,Dart,Bloc,Flutter Bloc,Cubit,我是新来的。我正在做一个应用程序与集团状态管理,可以改变作为系统主题的主题改变。现在它的工作很好,但我需要开关,可以覆盖的主题。我如何实现这一点?我通过观看youtube教程来制作这个应用程序。 不管怎样,这都是为了创建可以更改主题的开关 主题立体图 class ThemeCubit extends Cubit<ThemeState> { ThemeCubit() : super(ThemeState(themeMode: ThemeMode.light)) { upda
class ThemeCubit extends Cubit<ThemeState> {
ThemeCubit() : super(ThemeState(themeMode: ThemeMode.light)) {
updateAppTheme();
}
void updateAppTheme() {
final Brightness currentBrightness = AppTheme.currentSystemBrightness;
currentBrightness == Brightness.light
? _setTheme(ThemeMode.light)
: _setTheme(ThemeMode.dark);
}
void _setTheme(ThemeMode themeMode) {
AppTheme.setStatusBarAndNavigationBarColor(themeMode);
emit(ThemeState(themeMode: themeMode));
}
}
void main() {
Bloc.observer = AppBlocObserver();
runApp(DevicePreview(
builder: (context) => App(),
enabled: false,
plugins: [
const ScreenshotPlugin(),
],
));
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<ThemeCubit>(
create: (context) => ThemeCubit(),
),
],
child: MchatsApp(),
);
}
}
class MchatsApp extends StatefulWidget {
const MchatsApp({
Key key,
}) : super(key: key);
@override
_MchatsAppState createState() => _MchatsAppState();
}
class _MchatsAppState extends State<MchatsApp> with WidgetsBindingObserver {
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangePlatformBrightness() {
context.read<ThemeCubit>().updateAppTheme();
super.didChangePlatformBrightness();
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
return OrientationBuilder(
builder: (context, orientation) {
SizerUtil().init(constraints, orientation);
return MaterialApp(
locale: DevicePreview.locale(context),
builder: DevicePreview.appBuilder,
title: Strings.appTitle,
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
themeMode: context.select(
(ThemeCubit themeCubit) => themeCubit.state.themeMode),
debugShowCheckedModeBanner: false,
initialRoute: AppRouter.root,
onGenerateRoute: AppRouter.onGenerateRoute,
);
},
);
},
);
}
}
这是main.dart的代码
class ThemeCubit extends Cubit<ThemeState> {
ThemeCubit() : super(ThemeState(themeMode: ThemeMode.light)) {
updateAppTheme();
}
void updateAppTheme() {
final Brightness currentBrightness = AppTheme.currentSystemBrightness;
currentBrightness == Brightness.light
? _setTheme(ThemeMode.light)
: _setTheme(ThemeMode.dark);
}
void _setTheme(ThemeMode themeMode) {
AppTheme.setStatusBarAndNavigationBarColor(themeMode);
emit(ThemeState(themeMode: themeMode));
}
}
void main() {
Bloc.observer = AppBlocObserver();
runApp(DevicePreview(
builder: (context) => App(),
enabled: false,
plugins: [
const ScreenshotPlugin(),
],
));
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<ThemeCubit>(
create: (context) => ThemeCubit(),
),
],
child: MchatsApp(),
);
}
}
class MchatsApp extends StatefulWidget {
const MchatsApp({
Key key,
}) : super(key: key);
@override
_MchatsAppState createState() => _MchatsAppState();
}
class _MchatsAppState extends State<MchatsApp> with WidgetsBindingObserver {
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangePlatformBrightness() {
context.read<ThemeCubit>().updateAppTheme();
super.didChangePlatformBrightness();
}
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
return OrientationBuilder(
builder: (context, orientation) {
SizerUtil().init(constraints, orientation);
return MaterialApp(
locale: DevicePreview.locale(context),
builder: DevicePreview.appBuilder,
title: Strings.appTitle,
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
themeMode: context.select(
(ThemeCubit themeCubit) => themeCubit.state.themeMode),
debugShowCheckedModeBanner: false,
initialRoute: AppRouter.root,
onGenerateRoute: AppRouter.onGenerateRoute,
);
},
);
},
);
}
}
void main(){
Bloc.observer=AppBlocObserver();
runApp(DevicePreview(
生成器:(上下文)=>App(),
启用:false,
插件:[
const ScreenshotPlugin(),
],
));
}
类应用程序扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回多BlocProvider(
供应商:[
BlocProvider(
create:(context)=>ThemeCubit(),
),
],
子项:MchatsApp(),
);
}
}
类MchatsApp扩展StatefulWidget{
康斯特麦克哈塔普({
关键点,
}):super(key:key);
@凌驾
_MchatsAppState createState()=>\u MchatsAppState();
}
类MchatsAppState使用WidgetsBindingObserver扩展状态{
@凌驾
void initState(){
WidgetsBinding.instance.addObserver(这个);
super.initState();
}
@凌驾
无效处置(){
WidgetsBinding.instance.removeObserver(此);
super.dispose();
}
@凌驾
void didchangeflatformbrightness(){
context.read().updateAppTheme();
super.didChangePlatformBrightness();
}
@凌驾
小部件构建(构建上下文){
返回布局生成器(
生成器:(上下文、约束){
返回方向生成器(
生成器:(上下文、方向){
SizerUtil().init(约束、方向);
返回材料PP(
locale:DevicePreview.locale(上下文),
生成器:DevicePreview.appBuilder,
标题:Strings.appTitle,
主题:AppTheme.lightTheme,
暗色调:AppTheme.darkTheme,
主题:context.select(
(ThemeCubit ThemeCubit)=>ThemeCubit.state.themeMode),
debugShowCheckedModeBanner:false,
initialRoute:AppRouter.root,
onGenerateRoute:AppRouter.onGenerateRoute,
);
},
);
},
);
}
}
是的,您可以
在Switch小部件的onChanged函数中,在cubit中调用updateAppTheme()函数
context.read<ThemeCubit>().updateAppTheme();
context.read().updateaptheme();
Builder(
生成器:(上下文){
bool isDark=context.select(
(ThemeCubit ThemeCubit)=>ThemeCubit.state.themmode)==themmode.dark?true:false;
返回开关(值:isDark,一旦更改:(值){
context.read().updateAppTheme();}
);
})
它不工作。开关(activeColor:Colors.black,value:false,onChanged:(value){ScaffoldMessenger.of(context).showSnackBar(SnackBar(内容:Text('Theme Change'),持续时间:持续时间(毫秒:700),);setState((){context.read().updateAppTheme();_switchValue=value;});},),onChanged函数的值总是false,因为它没有stateWait。我尝试为您的problem@SunnyRahi尝试新代码它显示了这一点,但主题没有改变。I/flatter(5260):onChange--ThemeCubit,Change{currentState:Instance'themstate',nextState:Instance'themstate'}