【问题标题】:How to save the state of the app with the current theme in flutter?如何在flutter中保存当前主题的应用程序状态?
【发布时间】:2021-07-06 08:24:11
【问题描述】:

我正在为我的应用程序设置深色模式和浅色模式,但数据持久性存在问题,因为当我重新启动应用程序时,我的主题会回到默认主题,而不是我上次留下的主题在应用程序中,经过一些研究,我被提议使用 shared_preferences 插件,但我不知道如何在我的情况下使用它,因为我将主题从黑暗更改为明亮的方式是通过更改变量 ThemeMode toggleDarkTheme()toggleLightTheme() 方法中的 themeMode 初始值如下面的代码所示,那么如何使用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(
    ...
  );
}

main.dart:

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

【问题讨论】:

    标签: flutter dart sharedpreferences


    【解决方案1】:

    我在我的应用程序中使用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
    

    【讨论】:

    • 代码的第三部分应该去哪里? ThemeModeHandler.of(context).saveThemeMode(ThemeMode.dark);
    • @LakshanCosta 您可以使用该代码来更改和保留主题。将它放在小部件的 onTap 中,无论您在哪里显示主题更改选项。可以是对话框,也可以是下拉按钮。
    【解决方案2】:

    查看这个样板,有深色和浅色主题。

    我没有使用它,但它有效: https://github.com/zubairehman/flutter-boilerplate-project

    他将 Mobx 与 Stores(参见 my_app.dart 和 Themes_store.dart)以及 Provider (my_app.dart) 一起使用。

    所有颜色都在 app_theme.dart 中设置

    【讨论】:

    • 我检查了你链接的 repo,但它很大,我不明白那里发生了什么,你能简化你使用 shared_preferences 保存数据并初始化数据的部分吗启动时?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多