Flutter 应用暗模式会触发StatefulWidget的构建方法
我正在尝试将黑暗主题应用到应用程序中,当我打开和关闭黑暗主题的开关时,我可以看到构建方法被调用了几次Flutter 应用暗模式会触发StatefulWidget的构建方法,flutter,dart,Flutter,Dart,我正在尝试将黑暗主题应用到应用程序中,当我打开和关闭黑暗主题的开关时,我可以看到构建方法被调用了几次 为什么呢 这是颤振的正常行为吗 这会导致性能问题吗 注意:我在build方法中添加了一个print语句,以确定调用build方法的次数 我是否应该在代码中进行更改以更正此行为 import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; void main() => runApp(MyAp
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
print("MyApp");
return ChangeNotifierProvider<ThemeChanger>(
create: (_) => ThemeChanger(ThemeData.dark()),
child: new MaterialAppWithTheme(),
);
}
}
class MaterialAppWithTheme extends StatelessWidget {
@override
Widget build(BuildContext context) {
print("MaterialAppWithTheme");
final theme = Provider.of<ThemeChanger>(context);
return MaterialApp(
home: SettingScreen(),
theme: theme.getTheme(),
);
}
}
class SettingScreen extends StatelessWidget {
static final routeName = "./SettingScreen";
@override
Widget build(BuildContext context) {
print("SettingScreen");
ThemeData themeData = Theme.of(context);
return Scaffold(
appBar: AppBar(
title: const Text(
"Settings",
),
),
body: ListView(
children: <Widget>[
const SizedBox(
height: 10,
),
Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
child: Column(
children: <Widget>[
Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: themeData.primaryColor,
),
width: double.infinity,
child: const Text(
"User Settings",
style: TextStyle(fontSize: 15, color: Colors.white),
textAlign: TextAlign.center,
),
),
const SizedBox(
height: 10,
),
DarkThemeOption(),
],
),
),
],
),
);
}
}
class DarkThemeOption extends StatefulWidget {
@override
_DarkThemeOptionState createState() => _DarkThemeOptionState();
}
class _DarkThemeOptionState extends State<DarkThemeOption> {
var enableDarkTheme = false;
var themeProvider;
ThemeData themeData;
@override
void initState() {
print("_DarkThemeOptionState init");
themeProvider = Provider.of<ThemeChanger>(context, listen: false);
super.initState();
}
@override
Widget build(BuildContext context) {
print("_DarkThemeOptionState");
themeData = Theme.of(context);
return Padding(
padding: const EdgeInsets.only(top: 5, left: 22, bottom: 10),
child: Row(
children: <Widget>[
const Text(
"Enable Dark Theme",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.blue,
),
),
const Spacer(),
Switch(
activeColor: themeData.accentColor,
value: enableDarkTheme,
onChanged: (value) async {
// final status = await authProvider.updateThemeSetting(value);
setState(() {
enableDarkTheme = value;
if (!enableDarkTheme) {
themeProvider.setTheme(ThemeData.light());
} else {
themeProvider.setTheme(ThemeData.dark());
}
});
}),
],
),
);
}
}
class ThemeChanger with ChangeNotifier {
ThemeData _themeData;
ThemeChanger(this._themeData);
getTheme() => _themeData;
setTheme(ThemeData theme) {
_themeData = theme;
notifyListeners();
}
}
这是正常的,因为在更改主题、本地化等时,它必须重新呈现视图,因此再次调用编译方法。这是正常的,因为在更改主题、本地化等时,它必须重新呈现视图,因此再次调用编译方法
I/flutter ( 1176): MaterialAppWithTheme
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): MaterialAppWithTheme
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): MaterialAppWithTheme
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState
I/flutter ( 1176): SettingScreen
I/flutter ( 1176): _DarkThemeOptionState