基本上就是标题.我将这些函数应用于CubinoSwitch值,但它没有切换.为了确保这一点,如果我将值硬编码为True,switch 将变为绿色,所以我猜这是onChanged中的某个东西.我在主题提供程序中切换它是错误的吗?

主题_提供者.dart

import 'package:chat_app/themes/dark_mode.dart';
import 'package:chat_app/themes/light_mode.dart';
import 'package:flutter/material.dart';

class ThemeProvider extends ChangeNotifier {
  final ThemeData _themeData = lightMode;

  ThemeData get getTheme => _themeData;

  bool get isDarkMode => _themeData == darkMode;

  set themeData(ThemeData themeData) {
    themeData = themeData;
    notifyListeners();
  }

  void toggleTheme() {
    themeData = isDarkMode ? lightMode : darkMode;
  }
}

设置.省道

import 'package:chat_app/themes/主题_提供者.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class SettingsPage extends StatelessWidget {
  const SettingsPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Theme.of(context).colorScheme.background,
      appBar: AppBar(
        title: const Text("Settings"),
        backgroundColor: Colors.transparent,
        elevation: 0,
        foregroundColor: Colors.grey,
      ),
      body: Container(
        decoration: BoxDecoration(
          color: Theme.of(context).colorScheme.secondary,
          borderRadius: BorderRadius.circular(12),
        ),
        margin: const EdgeInsets.all(25),
        padding: const EdgeInsets.all(16),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            const Text("Dark Mode"),
            CupertinoSwitch(
              value: Provider.of<ThemeProvider>(context).isDarkMode,
              onChanged: (value) =>
                  Provider.of<ThemeProvider>(context, listen: false)
                      .toggleTheme(),
            ),
          ],
        ),
      ),
    );
  }
}

推荐答案

CupertinoSwitch的取值为isDarkMode,这是一个用于判断_themeData是否等于darkMode的获取器.但在themeData的setter中,您使用的是themeData = themeData,这里的两个themeData都引用了参数(它是类的themeData属性的shadows).调用实际的themeData设置器也是错误的,因为它将无限期地继续调用自己.你要做的是改成_themeData.

set themeData(ThemeData themeData) {
  _themeData = themeData;
  notifyListeners();
}

Flutter相关问答推荐

无法在GroupButton内部正确呈现

Build.gradle专线:2个Flutter Flutter

本机调试符号包含无效的目录调试符号.目前仅支持Android ABI

Flutter AppBar Animation反向调试

遇到图像路径格式问题

Flutter 翼future 建造者不断开火和重建.它在每次重建时都会生成一个新的随机数--我如何防止这种情况?

Android Studio将不会构建iOS模拟器应用程序,因为plist.info有问题

集装箱堆放和定位时的高度问题

如何给按钮的边框半径?

Flutter 未处理的异常 - 对 null 值使用 Null 判断运算符

如何获取flutter中gridview项目占用的高度和宽度?

Flutter底部面板局部显示

如何正确地将 PageView 设置为 AppBar 的标题?

Firebase Auth - 有没有办法为新用户预先生成 UID?

Flutter:为什么我的 listTile colored颜色 被容器 colored颜色 覆盖了?

从子类调用超类的超方法

如何在 Flutter 执行通知时运行后台代码?

Flutter 如何使用 ClipPath 编辑容器的顶部?

Flutter:如何将列表转换为字符串?

如何使用 Navigator 2.0 导航到任何页面?