Ошибка переполнения стека во флаттере с использованием ChangeNotifierProvider? - PullRequest
1 голос
/ 28 февраля 2020

Я получаю следующую ошибку -

I / flutter (18695): Следующая ошибка StackOverflowError была сгенерирована при построении Consumer (загрязнено, зависимости:

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

I / flutter (18695): переполнение стека

Это, похоже, связано с ошибкой в ​​моем приемнике. Я использую плагин провайдера, чтобы попытаться создать кнопку переключения для темного режима во флаттере.

См. Ниже мои файлы -

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,
              ),
            ),
          ),
        ],
      ),
    ); 
  }

Есть идеи, почему выдает эту ошибку?

1 Ответ

0 голосов
/ 29 февраля 2020

Как указала Вирен V Варасадия, ваш геттер для darkTheme неверен:

bool get darkTheme => darkTheme; 

Предположительно, вы хотели указать его на _darkTheme, но вместо этого у вас есть геттер, который возвращает сам себя , Это означает, что каждый раз, когда вы вызываете darkTheme, получатель ищет значение darkTheme, что заставляет получатель искать значение darkTheme, что заставляет получатель искать значение darkTheme, что делает получатель ищет значение darkTheme, что заставляет его искать ... (надеюсь, вы поняли идею).

Вам просто нужно изменить получатель, чтобы вернуть правильную вещь:

bool get darkTheme => _darkTheme; 
...