【问题标题】:Hive Flutter Usage蜂巢颤振使用
【发布时间】:2021-01-29 21:37:38
【问题描述】:

我是 Flutter 和 Hive 的新手,正在学习。以下是一些问题:

  1. 我正在使用 Value Listenable Builder,当我按下“Person age Up”时,person1 的年龄不会更新,但如果我按下 setstate,则会更新。 如何自动更新?

  2. Hive 是一个数据库;如果我按“添加人员”,它会添加,当我按“打印人员长度”时会看到,但是当重新加载应用程序时,人员长度再次更改为 1,所有添加都已删除:

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'departmentClass.dart';
import 'person.dart';

void main() async {
  await Hive.initFlutter('test');
  Hive.registerAdapter(DepartmentAdapter());
  Hive.registerAdapter(PersonAdapter());
  await Hive.openBox<Department>('testBox');

  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final Box testBox = Hive.box<Department>('testBox');

  @override
  Widget build(BuildContext context) {
    if (testBox.isEmpty) {
      final List<Person> personsAll = [];

      final person1 = new Person(23, "Maria");
      personsAll.add(person1);
      var mydepartment = new Department(34, "newD", personsAll);

      Hive.box<Department>('testBox').put("01", mydepartment);
    }
    return ValueListenableBuilder(
      valueListenable: testBox.listenable(),
      builder: (context, box, widget) {
        return MaterialApp(
          home: SafeArea(
            child: Scaffold(
              appBar: AppBar(
                title: Text("Hive Test"),
              ),
              body: Center(
                  child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text("Hive  Sample"),
                  RaisedButton(
                    child: Text("Clear Box"),
                    onPressed: () {
                      Hive.box<Department>('testBox').clear();
                    },
                  ),
                  Text("Person1 Age Now: " + box.get("01").persons[0].age.toString()),
                  RaisedButton(
                    child: Text("Person age UP"),
                    onPressed: () {
                      box.get("01").persons[0].age++;
                      print(box.get("01").persons[0].age);
                    },
                  ),
                  RaisedButton(
                    child: Text("Set State"),
                    onPressed: () {
                      setState(() {});
                    },
                  ),
                  RaisedButton(
                    child: Text("Add person "),
                    onPressed: () {
                      final person2 = new Person(23, "Maria");
                      box.get("01").persons.add(person2);
                    },
                  ),
                  RaisedButton(
                    child: Text("Print person lenght "),
                    onPressed: () {
                      print("Persons: " + Hive.box<Department>('testBox').get("01").persons.length.toString());
                    },
                  )
                ],
              )),
            ),
          ),
        );
      },
    );
  }
}

【问题讨论】:

    标签: flutter flutter-hive


    【解决方案1】:

    首先,当您打开一个盒子时,最好声明它是泛型类型; final Box&lt;Department&gt; testBox = Hive.box&lt;Department&gt;('testBox');


    其次,如果你想通过ValueListenableBuilder通知盒子你正在收听,你需要在每次更改值时将值放在盒子内;

    box.get("01").persons[0].age++;
    
    // this will notify the valuelistenablebuilder
    box.put("01", box.get("01"));
    print(box.get("01").persons[0].age);
    

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 2021-04-16
      • 2021-11-17
      • 2021-10-07
      • 1970-01-01
      • 2019-02-07
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多