首页 > 解决方案 > 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 '),
          ),
      ),
        ),
     ]) );
  }
}

标签: flutterdart

解决方案


当你想切换主题时,使用_isDark = !_isDark;(而不是!=)来改变一个布尔值的反面。


推荐阅读