dart Hive更新问题

vulvrdjw  于 5个月前  发布在  Hive
关注(0)|答案(1)|浏览(54)

我在Flutter中使用hive创建了一个基本的应用程序,用于创建,删除,更新和阅读员工详细信息,更新功能不起作用。我通过更新功能传递class的对象,但它不起作用,我使用模型列表来存储数据。
这是hive控制器的代码:

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


我该怎么解决呢?

f5emj3cl

f5emj3cl1#

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

无论如何,我会检查使用Hive时的两个常见错误:
1.确认盒子已打开:Hive.openBox('db');需要在var box = Hive.box('db');前添加openBox
1.如果你想处理对象而不是键/值,你必须注册一个TypeAdapter,它可以将对象从二进制形式转换为二进制形式。在文档页面中有一个很好的例子。
我通常做的是创建一个类来启动Hive。我称之为“本地化服务”:

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
    }
}

字符串
我从我的主.dart文件中的LocalWebService类调用initLocalStorage()方法:

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

    runApp(MyApp());

}

相关问题