【问题标题】:When I implement hive library for save theme mode, I have null error当我为保存主题模式实现 hive 库时,出现空错误
【发布时间】:2022-06-12 22:03:41
【问题描述】:

这是 hive.db.dev 的原始代码。我试图修复它,但我不能。我试着把“?”和 ”!”但它没有解决它。这是代码。

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

const darkModeBox = 'darkModeTutorial';

void main() async {
  await Hive.initFlutter();
  await Hive.openBox(darkModeBox);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: Hive.box(darkModeBox).listenable(),
      builder: (context, box, widget) {
        var darkMode = box.get('darkMode', defaultValue: false);
        return MaterialApp(
          themeMode: darkMode ? ThemeMode.dark : ThemeMode.light,
          darkTheme: ThemeData.dark(),
          home: Scaffold(
            body: Center(
              child: Switch(
                value: darkMode,
                onChanged: (val) {
                  box.put('darkMode', !darkMode);
                },
              ),
            ),
          ),
        );
      },
    );
  }
}

这里还有错误信息 =>

错误:方法 'get' 没有为类 'Object?' 定义。
- “对象”来自“飞镖:核心”。
尝试将名称更正为现有方法的名称,或定义名为“get”的方法。

           var darkMode = box.get('darkMode', defaultValue: false);  
                              ^^^

错误:没有为类“Object?”定义方法“put”。
- “对象”来自“飞镖:核心”。
尝试将名称更正为现有方法的名称,或定义名为“put”的方法。

                    box.put('darkMode', !darkMode); 
                        ^^^   

在 255 毫秒内重新启动应用程序。

【问题讨论】:

    标签: flutter dart flutter-hive


    【解决方案1】:

    要清除错误,您需要告诉ValueListenableBuilder 它所处理的数据类型,在本例中为Box 类型。

    return ValueListenableBuilder<Box>(...) // adding <Box>
    

    仅此一项就可以解决问题。

    但是,我会以不同的方式处理此问题,这样您就不会直接从ValueListenableBuilder 访问Hive 框。一般来说,我建议避免直接从 UI 与数据库等核心内容进行直接交互。

    您可以创建一个ThemeStorage 类,它是一个简单的布尔值isDarkMode。发生了什么变化,它将触发重建并存储更新的值。应用程序重新启动后,它将默认为存储的任何内容。这些字段是static,因为您永远不需要创建此类的新对象。

    class ThemeStorage {
      static ValueNotifier<bool> isDarkMode =
          ValueNotifier(Hive.box(darkModeBox).get('darkMode') ?? false);
    
      static void toggleDarkMode() {
        isDarkMode.value = !isDarkMode.value; // this will trigger a rebuild
        
        Hive.box(darkModeBox)
            .put('darkMode', isDarkMode.value); // this stores the updated value
      }
    }
    

    现在您的MyApp 已简化,它所关心的只是一个简单的bool。如果将来您想要更复杂的主题,您可以在 ThemeStorage 类中定义它们,而不是从 bool 构建,您可以构建 ThemeData 变量。

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
          // be sure to always put data type here
        return ValueListenableBuilder<bool>(
          valueListenable: ThemeStorage.isDarkMode,
          builder: (_, isDarkMode, __) {
            // here isDarkMode is a bool and not an Object because of inserting bool above
            return MaterialApp(
              theme: isDarkMode ? ThemeData.dark() : ThemeData.light(),
              home: Scaffold(
                body: Center(
                  child: Switch(
                    value: isDarkMode,
                    onChanged: (val) => ThemeStorage.toggleDarkMode(),
                  ),
                ),
              ),
            );
          },
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多