我收到以下错误 -
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/