flutter - ChangeNotifier 属性不更新(Flutter2)
问题描述
在尝试使用 Change Notifier 类 ( code ) 中定义的单个实例全局属性更改 App 主题_isDark
时,即使执行了更改函数,用于监视当前应用程序主题的属性也不会更改。
尝试将其定义为实例和静态,但属性根本不会更新。
在 Bool 类中也找不到!=
(不等于) 运算符
如何解决这个问题?
输出:
switchTheme() _isDark = true
Listener -> Change Theme
switchTheme() _isDark = true
Listener -> Change Theme
switchTheme() _isDark = true
Listener -> Change Theme
更改主题.dart:
import 'package:flutter/material.dart';
class MyTheme extends ChangeNotifier{
static bool _isDark = true;//Not updating in switchTheme()
// bool _isDark = true; //Not updating in switchTheme()
void switchTheme(){
_isDark != _isDark;//Avoid unnecessary statements Android Studio
print('switchTheme() _isDark = $_isDark');
notifyListeners();
}
ThemeMode currentTheme(){
return _isDark ? ThemeMode.dark : ThemeMode.light;
}
配置飞镖:
library config.dart ;
import 'changeTheme.dart';
MyTheme myTheme = MyTheme();
homeScreen.dart:
import 'package:flutter/material.dart';
import 'config.dart';
import 'changeTheme.dart';
void main(){runApp(
MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
themeMode: myTheme.currentTheme(),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
void initState(){
super.initState();
myTheme.addListener(() {
print('Listener -> Change Theme');
setState(() {
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children : [
Positioned(
left: MediaQuery.of(context).size.width * 0.5,
top: MediaQuery.of(context).size.height * 0.5,
child: Container(
width: MediaQuery.of(context).size.width * 0.1,
height: MediaQuery.of(context).size.height * 0.05,
child: ElevatedButton(
onPressed: (){
myTheme.switchTheme();
} ,
style: ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.orangeAccent)),
child: Text('Change Theme '),
),
),
),
]) );
}
}
解决方案
当你想切换主题时,使用_isDark = !_isDark;
(而不是!=
)来改变一个布尔值的反面。
推荐阅读
- ruby-on-rails - 如何在 Rails 的供应商子文件夹中获取资产?
- redux - 操作调用使用 fetch-mock 返回“未定义”
- java - 输入实时html中的最大值限制
- scala - 了解 Akka FSM `onTransition`
- android - RxJava - 在后台顺序调用两个方法并在主线程中返回值
- python - 时间序列中的样条插值
- python - Bokeh Slider 自定义 JS 回调
- javascript - jQuery UI Datepicker Gravity Forms 提醒 1 天下午 5 点后
- php - PHP:检查目录是否为空的最快方法?
- c - 动态数组的C值错误