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

Tim*_*k10 4 android-contentprovider dart flutter

我收到以下错误 -

I/flutter (18695):以下 StackOverflowError 被抛出构建消费者(脏,依赖:

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

I/flutter (18695): 堆栈溢出

这似乎与我的消费者中的错误有关。我正在使用 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(); 
  }

}
Run Code Online (Sandbox Code Playgroud)

下面是我的 main.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(); 
  }

}
Run Code Online (Sandbox Code Playgroud)

知道为什么会抛出这个错误吗?

Abi*_*n47 13

正如 Viren V Varasadiya 指出的,你的 getterdarkTheme是不正确的:

bool get darkTheme => darkTheme; 
Run Code Online (Sandbox Code Playgroud)

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

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

bool get darkTheme => _darkTheme; 
Run Code Online (Sandbox Code Playgroud)