flutter - 如何在flutter中使用当前主题保存应用程序的状态?

标签 flutter dart sharedpreferences

我正在为我的应用程序设置暗模式和亮模式,但是数据持久性存在问题,因为当我重新启动应用程序时,我的主题会恢复为默认主题,而不是我上次在应用程序,经过一些研究,我被提议使用 shared_preferences 插件,但我不知道如何在我的情况下使用它,因为我将主题从暗更改为亮的方式是通过更改变量 主题模式 主题模式 中的初始值toggleDarkTheme() 切换LightTheme() 方法如下面的代码所示,那么如何使用 shared_preferences 在我的设备中保存该值?
我的 theme_provider.dart 文件:

// Flutter imports:
import 'package:flutter/material.dart';

// Package imports:
import 'package:flutter_riverpod/flutter_riverpod.dart';

final themeProvider = ChangeNotifierProvider<ThemeProvider>((ref) {
  return ThemeProvider();
});

class ThemeProvider with ChangeNotifier {
  ThemeMode themeMode = ThemeMode.system;

  void toggleDarkTheme() {
    themeMode = ThemeMode.dark;
    notifyListeners();
  }

  void toggleLightTheme() {
    themeMode = ThemeMode.light;
    notifyListeners();
  }
}

mixin MyThemes {
  static final darkTheme = ThemeData.dark().copyWith(
    ...
  );
  static final lightTheme = ThemeData.light().copyWith(
    ...
  );
}

主要.dart:
final themeStatus = watch(themeProvider);
    return MaterialApp(
      themeMode: themeStatus.themeMode,
      darkTheme: MyThemes.darkTheme,
      theme: MyThemes.lightTheme,

最佳答案

我正在使用 theme_mode_handlershared_preferences在我的应用程序中切换和保留主题。
下面是一个例子:
添加 theme_mode_handler给您的 pubspec.yaml

dependencies:
  theme_mode_handler: ^3.0.0
  shared_preferences: ^2.0.6
创建一个实现 IThemeModeManager 的类界面:
import 'package:shared_preferences/shared_preferences.dart';
import 'package:theme_mode_handler/theme_mode_manager_interface.dart';

class ThemeManager implements IThemeModeManager{
  @override
  Future<String> loadThemeMode() async {
    final _prefs = await SharedPreferences.getInstance();
    return _prefs.getString("THEME_PREF");
  }

  @override
  Future<bool> saveThemeMode(String value) async {
    final _prefs = await SharedPreferences.getInstance();
    return _prefs.setString("THEME_PREF", value);
  }
}
ThemeModeHandler 包裹 MaterialApp小部件并将其传递给您的经理的实例:
import 'package:theme_mode_handler/theme_mode_handler.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ThemeModeHandler(
      manager: ThemeManager(),
      builder: (ThemeMode themeMode) {
        return MaterialApp(
          themeMode: themeMode,
          darkTheme: MyThemes.darkTheme,
          theme: MyThemes.lightTheme,
          home: MyHomePage(),
        );
      },
    );
  }
}
然后最后更改您可以使用的主题:
ThemeModeHandler.of(context).saveThemeMode(ThemeMode.dark); //Dark theme
ThemeModeHandler.of(context).saveThemeMode(ThemeMode.light); //Light theme
ThemeModeHandler.of(context).saveThemeMode(ThemeMode.system); //System theme

关于flutter - 如何在flutter中使用当前主题保存应用程序的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68267016/

相关文章:

flutter - CircularProgressIndicator 不会停止

flutter - 为什么要扩大而不是扩大高度

android - 无法从图库中选取图片

flutter - 如何在 Flutter 中的新 OutlinedButton 小部件上实现圆角?

flutter - 是否可以在一个小部件中两次使用SharedPreferences?

java - 将 5 种不同的产品保存到共享首选项

android - Flutter redux StoreConnector vs StoreBuilder

dart - #在当前dart中代表什么

android - 为什么使用模拟器在 Android Studio 中重新安装后 SharedPreferences 仍然存在?

flutter 网络 : how to programmatically close app (browser tab)