Flutter 将 Hive 数据库与 Riverpod 集成

Posted

技术标签:

【中文标题】Flutter 将 Hive 数据库与 Riverpod 集成【英文标题】:Flutter integrating Hive database with Riverpod 【发布时间】:2021-09-26 19:38:31 【问题描述】:

StatefulWidgets上使用Hive键值数据库非常简单,例如:

class HookDemo extends StatefulWidget 
  @override
  _HookDemoState createState() => _HookDemoState();


class _HookDemoState extends State<HookDemo> 
  Box user;
  @override
  void initState() 
    super.initState();
    
    user = Hive.box<User>('user');
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () 
            final _u = User()
                ..nameFamily = 'myname'
                ..mobileNumber = '123456789';
            _user!.add(_u);
            _u.save();
        ,
        child: Icon(Icons.add),
      ),
      ...
    );
  

在这里我们定义了Box user 属性,在initState 内部我们实现了用户,例如user = Hive.box&lt;User&gt;('user');

之后我们可以毫无问题地使用user 并得到already opened 错误

现在在这个当前的应用程序中,我们使用了HookWidget,当我们想使用Hive时,我们得到box already opened的错误

main.dart:

Future<void> initHiveDriver() async 
  final appDocumentDirectory = await path_provider.getApplicationDocumentsDirectory();
  await Hive.initFlutter(appDocumentDirectory.path);

  await Hive.openBox<UserAdapter>('user');


Future<void> main() async 
    WidgetsFlutterBinding.ensureInitialized();
    ///...
    initHiveDriver();

    runApp(
      ProviderScope(observers: [
        Logger()
      ],
      child: MyApp()),
    );

如何使用RiverpodHive 创建提供程序并将其用于HookWidget

【问题讨论】:

看起来不错。为什么说不正确? 关于类型推断尝试使用 FutureProvider。关于初始化,只要在不被丢弃的地方观看,未来会被重用。因此,您可以在 Material 应用程序上方做一个 ref.watch,例如 【参考方案1】:

我正在像这样将 Hive 与 Riverpod 一起使用。

我正在使用命名构造函数,因此我可以等待 openBox 调用。

final hiveProvider = FutureProvider<HiveDB>((_) => HiveDB.create());

class HiveDB 
  var _userBox;

  HiveDB._create() 

  static Future<HiveDB> create() async 
    final component = HiveDB._create();
    await component._init();
    return component;
  

  _init() async 
      Hive.registerAdapter(UserAdapter());
      this._userBox = await Hive.openBox<User>('user');
  

  storeUser(User user) 
    this._userBox.put('user', user);
  

  User getUser() 
    return this._userBox.get('user');
  


在 ConsumerWidget 中使用:

class SomeWidget extends ConsumerWidget 

  Widget build(BuildContext context, WidgetRef ref) 
      final provider = ref.watch(hiveProvider).data?.value;

      ...
  


【讨论】:

以上是关于Flutter 将 Hive 数据库与 Riverpod 集成的主要内容,如果未能解决你的问题,请参考以下文章

Flutter & Hive - 如何在 Hive 中保存重新排序的列表

将大量数据插入 Flutter Hive 存储使应用程序崩溃

如何使用 JSON 格式备份和恢复 Flutter Hive 数据?

如何在 Flutter/Dart 中使用 Hive 框和索引以简单的方式将数据动态加载到 DataTable?

在 Flutter 中使用 Hive 数据库时我的应用程序冻结

Flutter Hive 无法检索 Map