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<User>('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()),
);
如何使用Riverpod
为Hive
创建提供程序并将其用于HookWidget
?
【问题讨论】:
看起来不错。为什么说不正确? 关于类型推断尝试使用 FutureProvider我正在像这样将 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?