flutter - 使用 ChangeNotifierProvider 的 Flutter 中的堆栈溢出错误?

标签 flutter dart android-contentprovider

我收到以下错误 -

I/flutter (18695): The following StackOverflowError was thrown building Consumer(dirty, dependencies:

I/flutter (18695): [_DefaultInheritedProviderScope]):

I/flutter (18695): Stack Overflow


这似乎与我的消费者中的错误有关。我正在使用 Provider 插件尝试为 Flutter 中的暗模式创建一个切换按钮。
请参阅下面的我的文件 -
appstatenotifier.dart
import 'package:flutter/material.dart'; 
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';


ThemeData light = ThemeData(
  brightness: Brightness.light, 
  primarySwatch: Colors.indigo, 
  accentColor: Colors.pink,
  scaffoldBackgroundColor: Color(0xfff1f1f1)
);

ThemeData dark = ThemeData(
  brightness: Brightness.dark, 
  primarySwatch: Colors.indigo, 
  accentColor: Colors.pink,
); 

class ThemeNotifier with ChangeNotifier {
  final String key = "theme"; 
  SharedPreferences prefs; 
  bool _darkTheme; 

  bool get darkTheme => darkTheme; 

  ThemeNotifier() {
    _darkTheme = false; 
  }

  toggleTheme() {
    _darkTheme = !_darkTheme; 
    notifyListeners(); 
  }

}
下面是我的 main.dart 相关小部件
class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    var themeData = ThemeData(
      primarySwatch: Colors.blue,
    );
    return ChangeNotifierProvider(
      create: (_) => ThemeNotifier(), 
        child: Consumer<ThemeNotifier>(
          builder: (context, ThemeNotifier notifier, child) {
            return MaterialApp(
              theme: notifier.darkTheme ? dark : light,
              title: 'Work Out Log',
              routes: MyApp.routes,
            );
          }
        ),
      );
    }
  }

  Widget buildDrawer(context) {
    return Drawer(
      child: ListView(
        children: <Widget>[
          ListTile(
            title: Text('Dark Theme'),
            trailing: Consumer<ThemeNotifier>(
              builder: (context, notifier, child) => SwitchListTile(
                title: Text("Dark mode"), 
                onChanged: (val) {
                  notifier.toggleTheme(); 
                }, 
                value: notifier.darkTheme,
              ),
            ),
          ),
        ],
      ),
    ); 
  }
知道为什么会抛出这个错误吗?

最佳答案

正如 Viren V Varasadiya 指出的那样,您的 darkTheme setter/getter 不正确:

bool get darkTheme => darkTheme; 

据推测,您打算将其指向 _darkTheme ,但您拥有的是返回自身的 getter。这意味着任何时候调用 darkTheme ,getter 都会查找 darkTheme 的值,这使得 getter 查找 darkTheme 的值,这使得 getter 查找 darkTheme 的值,这使得 getter 查找 darkTheme 的值,这使 setter/getter 查找...(希望你明白)。

您只需要更改 getter 即可返回正确的内容:

bool get darkTheme => _darkTheme; 

关于flutter - 使用 ChangeNotifierProvider 的 Flutter 中的堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60445535/

相关文章:

Dart CheckboxInputElement 不显示文本

android - 在 ContentProvider 中对多个 URI 使用 notifyChange 是否正确?

android - 使用 fileprovider 共享资源

firebase - 我如何从 flutter 的Firestore中检索每个文档的文档ID

android - SQLite数据库上的Flutter Background操作

android - Gradle任务AssembleDebug失败

javascript - 是否可以在dart中使用javascript之类的dart进行分解和散布在列表中?

android - 如何在android中的两个或多个应用程序之间安全地共享数据?

dart - 如何在 Flutter 中从 PageView onPageChanged 中的索引获取?

android - Flutter 预缓存图像