You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用Hive存储主题模式时出现get/put方法未定义报错

Flutter使用Hive持久化主题模式报get/put方法未定义问题修复

问题原因

报错核心原因是ValueListenableBuilder未显式指定泛型类型,Dart空安全模式下会将builder回调中的box参数默认推断为Object?类型,该类型不存在Hive Box类的get、put方法,因此抛出编译错误。直接给变量加空安全运算符?/!属于修改位置错误,无法解决根因。

原始问题代码

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);
                },
              ),
            ),
          ),
        );
      },
    );
  }
}

报错信息

错误:类 'Object?' 上未定义方法 'get'。

  • 'Object' 来自 'dart:core'。
    请尝试修正方法名为已存在的方法名称,或定义名为'get'的方法。
var darkMode = box.get('darkMode', defaultValue: false);  
                              ^^^

错误:类 'Object?' 上未定义方法 'put'。

  • 'Object' 来自 'dart:core'。
    请尝试修正方法名为已存在的方法名称,或定义名为'put'的方法。
box.put('darkMode', !darkMode); 
                        ^^^   

修复方案

给ValueListenableBuilder显式声明泛型为Box,让Dart正确识别回调参数类型,同时对get返回值做显式类型断言避免后续类型问题。

修复后完整代码

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(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    // 显式指定泛型为Box,解决类型推断错误
    return ValueListenableBuilder<Box>(
      valueListenable: Hive.box(darkModeBox).listenable(),
      builder: (context, Box box, widget) {
        // 显式将返回值断言为bool类型,匹配Switch组件的value要求
        final darkMode = box.get('darkMode', defaultValue: false) as bool;
        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);
                },
              ),
            ),
          ),
        );
      },
    );
  }
}

关键修改点

  • 为ValueListenableBuilder添加泛型参数<Box>,同时在builder回调中给box参数显式标注Box类型,让编译器正确识别box的类型,正常调用get/put方法
  • 给box.get的返回值添加as bool类型断言,避免动态类型带来的隐式类型错误
  • 补充了Flutter 2.0+版本要求的const构造、key等规范写法,不影响核心功能

内容的提问来源于stack exchange,提问作者Coder Duck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 03:22:04