Как настроить данные Провайдера на данные, которые хранятся в SharedPreferences во Flutter? - PullRequest
0 голосов
/ 19 апреля 2020

Я храню переменную bool isDarkTheme в своем классе General провайдера, я могу получить к нему доступ в любое время.

Я хочу сохранить предпочтения пользователя в этой теме и всякий раз, когда пользователь открывает приложение опять вместо isDarkThem = false Я хочу, чтобы он загружался из предпочтений, которые я сохранил в SharedPreferences.

Вот мой код General провайдера: (Я думаю, что он читается)

import 'package:shared_preferences/shared_preferences.dart';

class General with ChangeNotifier {
  bool isDarkTheme = false;

  General() {
    loadDefaultTheme();
  }

  void loadDefaultTheme() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    isDarkTheme = prefs.getBool("is_dark_theme") ?? false;
  }

  void reverseTheme() {
    isDarkTheme = !isDarkTheme;
    notifyListeners();
    saveThemePreference(isDarkTheme);
  }

  void saveThemePreference(bool isDarkTheme) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setBool("is_dark_theme", isDarkTheme);
  }
}

1 Ответ

1 голос
/ 19 апреля 2020

Dart не поддерживает асинхронные c конструкторы, поэтому я думаю, что мы должны использовать другой подход. Я обычно создаю экран spla sh (или экран загрузки, как вы его называете), чтобы загрузить все основные данные c сразу после открытия приложения.

Но если вы хотите получить только данные темы, Вы можете использовать пару async / await в методе main:

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // this line is needed to use async/await in main()

  final prefs = await SharedPreferences.getInstance();
  final isDarkTheme = prefs.getBool("is_dark_theme") ?? false;

  runApp(MyApp(isDarkTheme));
}

После этого мы можем передать этот фрагмент данных темы в конструктор General:

class MyApp extends StatelessWidget {
  final bool isDarkTheme;

  MyApp(this.isDarkTheme);

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => General(isDarkTheme), // pass it here
      child: MaterialApp(
        home: YourScreen(),
      ),
    );
  }
}

Мы должны изменить бит в общем классе, метод loadDefaultTheme не указан.

class General with ChangeNotifier {
  bool isDarkTheme;

  General(this.isDarkTheme);

 // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...