所以我试着和供应商换个主题,这是我的主打.dart

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:provider/provider.dart';
import 'package:themetestnew/homepage.dart';
import 'package:themetestnew/theme/theme_provider.dart';


void main() async {
  await Hive.initFlutter();
  await Hive.openBox('myBox');
  runApp(
    ChangeNotifierProvider(
      create: (context) => ThemeProviderNew(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
      theme: Provider.of<ThemeProviderNew>(context).themeData,
    );
  }
}

这是我的主题Provider

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:themetestnew/theme/theme.dart';

class ThemeProviderNew with ChangeNotifier {
  final _myBox = Hive.box('myBox');
  bool chosenTheme = false;
  ThemeData _themeData = lightMode;

  ThemeData get themeData => _themeData;

  set themeData(ThemeData themeData) {
    _themeData = themeData;
    notifyListeners();
  }

  void toggleTheme() {
    if (themeData == lightMode) {
      themeData = darkMode;
      chosenTheme = false;
    } else {
      themeData = lightMode;
      chosenTheme = true;
    }
    _myBox.put('theme', chosenTheme);
  }
}

如何保存主题并在开始时加载它? 我使用hive保存了一个bool,但可以在开始时根据该bool加载主题 我只能用按钮来换.

推荐答案

只需在类构造函数中添加这行代码,即可在应用程序首次启动时加载保存的主题.

_themeData = _myBox.get('theme') ?? lightMode;

判断下面的完整代码.

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:themetestnew/theme/theme.dart';

class ThemeProviderNew with ChangeNotifier {
  ThemeProviderNew() {
    // if the saved theme is null return the default theme otherwise return the saved one.
    _themeData = _myBox.get('theme') ?? lightMode;
  }

  final _myBox = Hive.box('myBox');
  bool chosenTheme = false;
  ThemeData _themeData = lightMode;

  ThemeData get themeData => _themeData;

  set themeData(ThemeData themeData) {
    _themeData = themeData;
    notifyListeners();
  }

  void toggleTheme() {
    if (themeData == lightMode) {
      themeData = darkMode;
      chosenTheme = false;
    } else {
      themeData = lightMode;
      chosenTheme = true;
    }
    _myBox.put('theme', chosenTheme);
  }
}

Flutter相关问答推荐

如何更改默认应用程序启动器/启动屏幕

Flutter 应用程序中的Firebase实时数据库中的orderByChild()不适用于我

脚本具有不受支持的MIME类型(';Text/html';).(messaging/failed-service-worker-registration)

BottomNavigationBar-我应该使用Container和Align吗?

摆动更改标记可轻敲文本按钮样式

如何让两个展开的Widget根据其子窗口的屏幕大小

Ffltter Firebase向用户添加公司

Riverpod 2.0-如何使用FutureOr和AutoDisposeSyncNotificationer处理api状态代码?

在 flutter 的列中使用 Expanded 时出现渲染 Flex 错误

无法在 ListView (Flutter) 中限制 Card 的最大宽度

Flutter / 为什么当我点击我的图片时我的模型没有更新?

使用 Riverpod 和 copyWith 方法更新数据类中列表中变量的值

Android Electric eel Mac M1:运行 flutter doctor -v 时无法找到Bundle 的 java 版本

如何在 cupertino switch flutter 中添加文本

Listview 如何转到下一行/新行?

Flutter snapShot.hasData 为假但响应有数据

无效的 depfile: C:\xxx\xxx\Flutter\project_name\.dart_tool\flutter_build\df4b308df1ee4bce22c56c71751554d1\kernel_snapshot.d 无效

如何在 flutter 中更改日期 Select 器 colored颜色 ?

Flutter Desktop,如何获取windows用户配置文件名称?

带图像封面的 ElevatedButton