(flutter)Hive 更新问题

问题描述 投票:0回答:1

我创建了一个基本应用程序,用于在 Flutter 中使用配置单元创建、删除、更新和读取员工详细信息,并且更新功能不起作用,我通过更新函数传递类的对象,但它不起作用,我正在使用以下列表模型来存储数据。

这是配置单元控制器的代码

import 'package:hive_demo/model/emplyee_model.dart';
import 'package:hive_flutter/hive_flutter.dart';

class EmployeeController {
  static List<EmployeeModel> employeeList = [];

  var box = Hive.box('db');

  void initData() {
    employeeList = [
      EmployeeModel(name: 'name', designation: 'designation'),
    ];
  }

  void adddata(EmployeeModel employeeModel) async {
    employeeList.add(employeeModel);
    await box.put('employeedb', employeeList);
  }

  void getData() {
    List demoList = box.get('employeedb');
    employeeList = demoList
        .map((e) => EmployeeModel(name: e.name, designation: e.designation))
        .toList();
  }

  void deletedata(int index) async {
    employeeList.removeAt(index);
    await box.put('employeedb', employeeList);
  }

  void updateData(int id, EmployeeModel employeeModel) async {
    await box.putAt(id, employeeModel);

    getData();
  }
}



这是主页代码

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_demo/controller/employee_controller.dart';
import 'package:hive_demo/model/emplyee_model.dart';

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

  @override
  State<Homepage> createState() => _HomepageState();
}

class _HomepageState extends State<Homepage> {
  TextEditingController nametextcontroller = TextEditingController();
  TextEditingController designationtextcontroller = TextEditingController();
  EmployeeController employeeController = EmployeeController();

  var box = Hive.box('db');

  @override
  void initState() {
    if (box.isNotEmpty) {
      employeeController.getData();
    } else {
      employeeController.initData();
    }

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            TextField(
              controller: nametextcontroller,
              decoration: const InputDecoration(
                  border: OutlineInputBorder(), hintText: 'name'),
            ),
            const SizedBox(
              height: 10,
            ),
            TextField(
              controller: designationtextcontroller,
              decoration: const InputDecoration(
                  border: OutlineInputBorder(), hintText: 'designation'),
            ),
            ElevatedButton(
                onPressed: () {
                  employeeController.adddata(EmployeeModel(
                      name: nametextcontroller.text,
                      designation: designationtextcontroller.text));
                  setState(() {});
                },
                child: const Text('Add')),
            Expanded(
              child: ListView.separated(
                  //list tile
                  itemBuilder: (context, index) => ListTile(
                        title:
                            Text(EmployeeController.employeeList[index].name),
                        subtitle: Text(
                            EmployeeController.employeeList[index].designation),
                        trailing: Row(
                          mainAxisSize: MainAxisSize.min,
                          children: [
                            IconButton(
                                onPressed: () {
                                  nametextcontroller.text = EmployeeController
                                      .employeeList[index].name;
                                  designationtextcontroller.text =
                                      EmployeeController
                                          .employeeList[index].designation;
                                },
                                icon: const Icon(Icons.edit)),
                            IconButton(
                                onPressed: () {
                                  employeeController.deletedata(index);
                                  setState(() {});
                                },
                                icon: const Icon(
                                  Icons.delete,
                                  color: Colors.red,
                                )),
                            IconButton(
                                onPressed: () {
                                  employeeController.updateData(
                                      index,
                                      EmployeeModel(
                                          name: nametextcontroller.text,
                                          designation:
                                              designationtextcontroller.text));

                                  setState(() {});
                                },
                                icon: const Icon(Icons.refresh)),
                          ],
                        ),
                      ),
                  separatorBuilder: (context, index) => const Divider(
                        height: 9,
                      ),
                  itemCount: EmployeeController.employeeList.length),
            )
          ],
        ),
      ),
    );
  }
}

我该如何解决?

database flutter dart hive
1个回答
1
投票

Hive它是一个非常快的数据库,它的主要目的是管理键/值数据,但是您可以使用TypeAdapters处理对象,也许您在其他文件中有这个定义,但我在代码中看不到它共享。

无论如何,我会检查使用 Hive 时是否存在两个常见错误:

  1. 确认盒子已打开:
    Hive.openBox('db');
    您需要在var box = Hive.box('db');
    之前添加
    openBox
  2. 如果您想处理对象而不是键/值,则必须注册一个 TypeAdapter 来将对象从二进制形式转换为二进制形式。 文档页面中有一个很好的示例。

我通常做的是创建一个类来启动Hive。我称之为“LocalStorageService”:

import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart';
import 'package:hive_demo/model/employee_model.dart';

class LocalStorageService {

    static Future<void> initLocalStorage() async {
        try {
            var dir = await getApplicationDocumentsDirectory();
            await Hive.initFlutter(dir.path);
            Hive.registerAdapter(EmployeeAdapter());
            
            await Hive.openBox('db');
            //initDefaults(); 

        } catch (e) {
            debugPrint("ERROR ON initLocalStorage(): ${e.toString()}");
        }
    }

    static void initDefaults() {
      // I use this function to run some validations and set default values
    }
}

我从 main.dart 文件中的 LocalStorageService 类调用

initLocalStorage()
方法:

void main() async {
    WidgetsFlutterBinding.ensureInitialized();    
    await LocalStorageService.initLocalStorage();

    runApp(MyApp());

}
© www.soinside.com 2019 - 2024. All rights reserved.