#flutter #dart
#флаттер #dart
Вопрос:
При попытке изменить тему приложения с помощью глобального свойства одного экземпляра, определенного в классе уведомителя об изменениях (code), свойство _isDark
, используемое для мониторинга текущей темы приложения, вообще не изменяется, хотя функция изменения выполняется.
Пытался определить его как экземпляр, так и статический, но свойство просто не обновляется.
Также не удалось найти !=
оператор (не равный) в классе Bool
Как это решить?
Вывод:
switchTheme() _isDark = true
Listener -> Change Theme
switchTheme() _isDark = true
Listener -> Change Theme
switchTheme() _isDark = true
Listener -> Change Theme
changeTheme.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;
}
config.dart:
library config.dart ;
import 'changeTheme.dart';
MyTheme myTheme = MyTheme();
Рабочий стол.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 '),
),
),
),
]) );
}
}
Комментарии:
1. Кроме того, почему в dart нет оператора != для bool? Android Studio помечает оператор как ненужный.
Ответ №1:
Если вы хотите переключить тему, используйте _isDark = !_isDark;
(и не !=
), чтобы изменить логическое значение на противоположное.