我是一个完全不懂扑扑的菜鸟,所以这个对你来说可能很容易。我正在尝试将 Hive 集成到我的应用程序中,以便我可以在本地存储信息。但是,我不确定我会如何做到这一点。这就是我到目前为止所拥有的,我很困惑。如果您能告诉我在代码中的何处添加/删除/更改内容,那就太好了。
主要功能
import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
await Hive.initFlutter();
Hive.registerAdapter(TodoAdapter());
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
home: Builder(
builder: (context) {
return GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child: const TodoApp(),
TODO 类等
class Todo {
final String text;
final bool checked;
int priority;
static int _tasknumber = 0;
final int key;
//TODO: UNDERSTAND THIS
Todo({
required this.text,
required this.checked,
required this.priority,
}) : key = _tasknumber++;
}
class TodoAdapter extends TypeAdapter<Todo> {
@override
final int typeId = 0;
@override
Todo read(BinaryReader reader) {}
@override
void write(BinaryWriter writer, Todo obj) {}
}
class TodoApp extends StatefulWidget {
const TodoApp({super.key});
@override
State<TodoApp> createState() => _TodoAppState();
}
class _TodoAppState extends State<TodoApp> {
final _textyController = TextEditingController();
List<Todo> data = [];
int? _radioValue = 1;
bool isEditing = false;
int editingIndex =
-1; // Initialize as -1 to indicate no active edit initially.
bool isContainerVisible = false;
bool settingsVisibility = false;
var box = await Hive.openBox<Todo>('todoBox');
box.add(yourTodo);
var todos = box.values.toList;
box.putAt(index, updatedTodo);
box.deleteAt(index);
await box.close;
final FocusNode _textFocus = FocusNode();
void dispose() {
_textFocus.dispose();
super.dispose();
}
@override
void initState() {
_textFocus.addListener(() {
setState(() {
isContainerVisible = _textFocus.hasFocus;
});
});
}
编辑/删除功能
SlidableAction(
backgroundColor: Colors.green,
icon: Icons.edit,
//label: 'Edit',
onPressed: (context) => {
setState(() {
isEditing = true;
editingIndex = index;
_textyController.text =
data[index].text;
_radioValue = data[index].priority;
_textFocus.requestFocus();
}),
},
),
SlidableAction(
backgroundColor:
Colors.red[400] ?? Colors.red,
icon: Icons.delete_forever,
//label: 'Delete',
onPressed: (context) => {
setState(() {
if (isEditing &&
editingIndex >= 0 &&
editingIndex < data.length) {
isEditing = false;
_textyController.text = '';
_radioValue = 1;
Slidable.of(context)?.close();
}
deleteTasks(index, data[index]);
}),
},
),
将新数据添加到列表中
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Radio(
value: 1,
groupValue: isEditing
? data[editingIndex].priority
: _radioValue,
onChanged: (changedRadio) {
setState(() {
if (isEditing) {
data[editingIndex].priority =
changedRadio ?? 1;
} else {
_radioValue = changedRadio;
}
_textFocus.requestFocus();
});
},
fillColor:
MaterialStateProperty.all(Colors.red),
),
//Text('High'),
],
),
child: TextField(
focusNode: _textFocus,
controller: isEditing
? TextEditingController(text: data[editingIndex].text)
: _textyController,
onSubmitted: (value) {
setState(() {
if (isEditing) {
data[editingIndex] = Todo(
text: value,
checked: data[editingIndex].checked,
priority: data[editingIndex].priority,
);
isEditing = false;
} else {
data.insert(
0,
Todo(
text: value,
checked: false,
priority: _radioValue ?? 0,
));
}
_textyController.clear();
_textFocus.requestFocus();
_textyController.selection = TextSelection.fromPosition(
TextPosition(offset: _textyController.text.length));
请查看官方文档这里。
您可以在您所在的州创建一个新框,例如:
class _TodoAppState extends State<TodoApp> {
...
late final Box<Todo> todoBox;
...
@override
void initState() async {
todoBox = await Hive.openBox<Todo>('todos');
}
然后要在小部件中获取待办事项,您可以使用
ValueListenableBuilder
,如本示例所示:https://pub.dev/packages/hive#hive--flutter
...
@override
Widget build(BuildContext context) {
return ValueListenableBuilder(
valueListenable: todoBox.listenable(),
builder: (context, box, widget) {
// TODO: handle todoBox here
return Switch(
value: todoBox.get('darkMode'),
onChanged: (val) {
todoBox.put('darkMode', val);
}
);
},
);
}
}
但请记住,
.listenable()
中的Box<E>
方法仅在添加以下pub时才可用:https://pub.dev/packages/hive_flutter