我正在开发一个Flutter应用程序,我首先要说的是,我是一个初学者,我处于移动开发的初期,我正在使用Hive在设备上存储数据,在调试时,我看到当我添加数据时,Hive正确更新,但是当我关闭并重新启动应用程序时,我失go 了一切,下面我将把打开盒子的主类的代码和使用蜂巢存储数据的另一个类的代码放在一起,项目的其他类不接触蜂巢,有人能帮助我吗?

主类:

import 'package:flutter/material.dart';
import 'package:todo/pages/home_page.dart';
import 'package:hive_flutter/hive_flutter.dart';

void main() async {
  //init the hive
  await Hive.initFlutter();

  //open a box
  var box = await Hive.openBox('myBox');

  //run the app
  runApp(const MyApp());
}

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
      theme: ThemeData(primarySwatch: Colors.purple),
    );
  }
}

主页类:

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:todo/pages/topic_page.dart';
import 'package:todo/util/dialog_box.dart';
import 'package:todo/util/topic_tile.dart';

class Topic {
  String topicName;
  List todo = [
    ["Add your first To-Do", false]
  ];

  Topic(this.topicName);

  void addTodo(List todoList) {
    todo.add(todoList);
  }

  void removeTodo(int index) {
    todo.removeAt(index);
  }

  String getName() {
    return topicName;
  }

  List getTodo() {
    return todo;
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  //reference the box
  final _myBox = Hive.box('mybox');

  //text controller
  final _controller = TextEditingController();

  //Database
  List topic = [];

  @override
  void initState() {
    if (_myBox.get("TOPIC") != null) {
      topic = _myBox.get("TOPIC");
    }
    super.initState();
  }

  //update the topic
  void updateTopic() {
    _myBox.put("TOPIC", topic);
  }

  //save new task
  void saveNewTopic() {
    setState(() {
      topic.add(Topic(_controller.text));
      _controller.clear();
    });
    Navigator.of(context).pop();
  }

  //new topic function
  void createNewTopic() {
    showDialog(
        context: context,
        builder: (context) {
          return DialogBox(
            text: "Add a new topic",
            controller: _controller,
            onSave: saveNewTopic,
            onCancel: () => Navigator.of(context).pop(),
          );
        });
    updateTopic();
  }

  //delete task
  void deleteTopic(int index) {
    setState(() {
      topic.removeAt(index);
    });
    updateTopic();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Color.fromARGB(255, 255, 190, 93),
        appBar: AppBar(
            title: const Align(
                alignment: Alignment.center,
                child: Text(
                  "Topic",
                  style: TextStyle(fontSize: 32, color: Colors.white),
                ))),
        floatingActionButton: FloatingActionButton(
          onPressed: createNewTopic,
          child: Icon(Icons.add),
        ),
        body: ListView.builder(
            itemCount: topic.length,
            itemBuilder: (context, index) {
              return GestureDetector(
                onTap: () {
                  Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => TopicPage(topic: topic[index]),
                    ),
                  );
                },
                child: TopicTile(
                  topicName: topic[index].getName(),
                  deleteFunction: (context) => deleteTopic(index),
                ),
              );
            }));
  }
}

推荐答案

当我使用这部分代码运行示例项目时,为了重新创建错误,当我点击浮动的操作按钮以添加第二项时,我收到了以下错误:

E/flutter ( 1691): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: HiveError: Cannot write, unknown type: Topic. Did you forget to register an adapter?
E/flutter ( 1691): #0      BinaryWriterImpl.write (package:hive/src/binary/binary_writer_impl.dart:338:9)
E/flutter ( 1691): #1      BinaryWriterImpl.writeList (package:hive/src/binary/binary_writer_impl.dart:223:7)
E/flutter ( 1691): #2      BinaryWriterImpl._writeList (package:hive/src/binary/binary_writer_impl.dart:390:7)
E/flutter ( 1691): #3      BinaryWriterImpl.write (package:hive/src/binary/binary_writer_impl.dart:329:7)
E/flutter ( 1691): #4      BinaryWriterImpl.writeFrame (package:hive/src/binary/binary_writer_impl.dart:282:9)
E/flutter ( 1691): #5      StorageBackendVm.writeFrames.<anonymous closure> (package:hive/src/backend/vm/storage_backend_vm.dart:128:31)
E/flutter ( 1691): #6      ReadWriteSync.syncWrite.<anonymous closure> (package:hive/src/backend/vm/read_write_sync.dart:26:41)
E/flutter ( 1691): <asynchronous suspension>
E/flutter ( 1691): #7      BoxImpl._writeFrames (package:hive/src/box/box_impl.dart:88:7)
E/flutter ( 1691): <asynchronous suspension>
E/flutter ( 1691): 

看起来您忘了为您的自定义对象注册适配器.因为配置单元需要您为放入其中的任何自定义对象注册适配器.在这里可以找到一个例子:Hive Objects.我们可以将Topic类移动到新文件中,并更新代码以:

import 'package:hive_flutter/hive_flutter.dart';

part 'topic.g.dart';

@HiveType(typeId: 1)  //          <-- this is a hive object
class Topic extends HiveObject {
  @HiveField(0)       //          <-- hive field
  String topicName;

  @HiveField(1)       //          <-- hive field
  List todo = [
    ["Add your first To-Do", false]
  ];

  Topic(this.topicName);

  void addTodo(List todoList) {
    todo.add(todoList);
  }

  void removeTodo(int index) {
    todo.removeAt(index);
  }

  String getName() {
    return topicName;
  }

  List getTodo() {
    return todo;
  }
}

然后,我们将在该行上得到一个错误:

part 'topic.g.dart';

因为我们应该生成This文件(它包含适配器).因此,我们在项目文件夹中执行以下命令:

dart run build_runner build

现在我们可以看到错误已经消失了.生成适配器后,我们将其添加到main.dart文件中,如下所示:

void main() async {
  //init the hive
  await Hive.initFlutter();

  // register the adapter for the Topic hive object
  Hive.registerAdapter(TopicAdapter());          // <-- this line right here

  //open a box
  await Hive.openBox('myBox');

  runApp(const MyApp());
}

最后,我们可以重新运行应用程序,并看到它如预期的那样工作.

有关存储自定义对象的完整教程,请参见here.

Flutter相关问答推荐

滚动时应用栏 colored颜色 更改Flutter

如何在应用栏中将列置于中心

具有可变高度小部件的SingleChildScrollView内的列

无法将Flutter 连接到Firebase

如何将Will POP示波器转换为POP数据抖动的POP示波器

ReCAPTCHA Enterprise中的严重安全漏洞

Flutter API请求BadState响应

UI中的Flutter 下拉列表值未更改

Flutter 文件拾取器Android SingleInstance模式它返回的文件路径为空

在Dart中使用Riverpod代码生成时出现问题(addListener)

运行调试flutter应用程序时出错:B/BL超出范围(最大+/-128MB)到'';

尽管 onCollision 处理了我的角色还是从平台上掉了下来

如何在flutter中更改showModalBottomSheet小部件中CheckboxListTile小部件的值?

找不到任何与 com.google.firebase:firebase-sessions:[15.0.0, 16.0.0) 匹配的版本

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

Agora VideoCall 不显示远程视频网格

如何从 showModalBottomSheet 中的 topRight 和 topLeft 移除平边

如何使用 Row 和 Column 制作 L 形布局?

如何验证位于 PageView 内不同页面的 TextFormFields

用于空值 FirebaseFirestore 的空值判断运算符