我创建了一个基本的应用程序,用于创建,删除,更新,和阅读员工详细信息,使用Flutter中的hive,更新函数不起作用,我通过更新函数传递类的对象,但它不起作用,我使用模型列表来存储数据。
这是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),
)
],
),
),
);
}
}
型
我该怎么解决呢?
1条答案
按热度按时间yr9zkbsy1#
Hive是一个非常快的数据库,它的主要目的是管理键/值数据,但是你可以使用TypeAdapters处理对象,也许你在其他文件中有这个定义,但我在共享的代码中看不到它。
无论如何,我会检查使用Hive时的两个常见错误:
1.确认盒子已打开:
Hive.openBox('db');
需要在var box = Hive.box('db');
前添加openBox1.如果你想处理对象而不是键/值,你必须注册一个TypeAdapter,它可以将对象从二进制形式转换为二进制形式。在文档页面中有一个很好的例子。
我通常做的是创建一个类来启动Hive。我称之为“本地化服务”:
字符串
我从我的主.dart文件中的LocalWebService类调用
initLocalStorage()
方法:型