使用 Hive 和 Flutter 来存储待办事项列表

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

我是一个完全不懂扑扑的菜鸟,所以这个对你来说可能很容易。我正在尝试将 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));
android flutter dart hive local-storage
1个回答
0
投票

请查看官方文档这里

您可以在您所在的州创建一个新框,例如:

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

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