首页 > 解决方案 > 我在颤振项目中遇到 Hive 错误

问题描述

这是我的 Main.dart 文件。在这里,我在主屏幕中打开名为添加表单的框。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Hive.initFlutter();
  //registering adapter that was created
  Hive.registerAdapter(AddFormAdapter());

  //opening box
  //loading all of our key value pairs from local storage into our memory, so that we have immediate access.
  await Hive.openBox<AddForm>('addForm');

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TabsScreen(),
    );
  }
}

这是我的 Hive 模型类。List Widget 字段是否在此处键入问题?有可能创造出这样的东西吗?

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
part 'addForm.g.dart';

@HiveType(typeId: 0)
class AddForm extends HiveObject {
  @HiveField(0)
  String title;

  @HiveField(1)
  String description;

  @HiveField(2)
  int fieldNumber;

  @HiveField(3)
  String question;

  @HiveField(4)
  List<Widget> fieldType;

  @HiveField(5)
  bool required;

  AddForm({this.title, this.description, this.fieldType});
}

这是生成的适配器类。

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'addForm.dart';

// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************

class AddFormAdapter extends TypeAdapter<AddForm> {
  @override
  final int typeId = 0;

  @override
  AddForm read(BinaryReader reader) {
    final numOfFields = reader.readByte();
    final fields = <int, dynamic>{
      for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
    };
    return AddForm()
      ..title = fields[0] as String
      ..description = fields[1] as String
      ..fieldNumber = fields[2] as int
      ..question = fields[3] as String
      ..fieldType = fields[4] as List<Widget>
      ..required = fields[5] as bool;
  }

  @override
  void write(BinaryWriter writer, AddForm obj) {
    writer
      ..writeByte(6)
      ..writeByte(0)
      ..write(obj.title)
      ..writeByte(1)
      ..write(obj.description)
      ..writeByte(2)
      ..write(obj.fieldNumber)
      ..writeByte(3)
      ..write(obj.question)
      ..writeByte(4)
      ..write(obj.fieldType)
      ..writeByte(5)
      ..write(obj.required);
  }

  @override
  int get hashCode => typeId.hashCode;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is AddFormAdapter &&
          runtimeType == other.runtimeType &&
          typeId == other.typeId;
}

这就是我想打开我的盒子的地方。这是一个底部导航栏,我想在其中打开并阅读我的一个选项卡上的一个框,但不幸的是它抛出了一些错误。

class TabsScreen extends StatefulWidget {
  const TabsScreen({Key key}) : super(key: key);

  @override
  _TabsScreenState createState() => _TabsScreenState();
}

class _TabsScreenState extends State<TabsScreen> {
  int _selectedPageIndex = 0;

  void _selectPage(int index) {
    setState(() {
      _selectedPageIndex = index;
    });
  }

  final List<Widget> _pages = [
    // FormsPage(),
    FutureBuilder(
      future: Hive.openBox('addForm'),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          if (snapshot.hasError) {
            return Center(child: Text(snapshot.error.toString()));
          } else
            return FormsPage();
        } else
          return Scaffold();
      },
    ),
    QuizzesPage(),
    AddFormsPage(),
    DraftsPage(),
    MorePage(),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_selectedPageIndex],

      // floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      bottomNavigationBar: BottomNavigationBar(
        selectedItemColor: Helper.primary,
        unselectedItemColor: Helper.secondary,
        selectedLabelStyle: TextStyle(
          fontSize: 15,
        ),
        onTap: _selectPage,
        currentIndex: _selectedPageIndex,
        showUnselectedLabels: true,
        type: BottomNavigationBarType.fixed,
        elevation: 15.0,
        items: [
          BottomNavigationBarItem(
            icon: Icon(
              Icons.date_range_outlined,
            ),
            label: 'Forms',
          ),
          BottomNavigationBarItem(
            icon: Icon(
              Icons.note,
            ),
            label: 'Quizzes',
          ),
          BottomNavigationBarItem(
            icon: Icon(
              Icons.add_circle,
              color: Helper.primary,
            ),
            label: 'add',
          ),
          BottomNavigationBarItem(
            icon: Icon(
              Icons.wifi_off,
            ),
            label: 'Drafts',
          ),
          BottomNavigationBarItem(
            icon: Icon(
              Icons.more_horiz_outlined,
            ),
            label: 'More',
          ),
        ],
      ),
    );
  }
}

这是我在屏幕上遇到的错误。谁能告诉我我的代码有什么问题。

//Error
Hive Error: The box "add Form" is already open and of type Box<Add Form>

标签: flutterflutter-hive

解决方案


推荐阅读