Свойство ChangeNotifier не обновляется (Flutter2)

#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; (и не != ), чтобы изменить логическое значение на противоположное.