【发布时间】: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
。关于初始化,只要在不被丢弃的地方观看,未来会被重用。因此,您可以在 Material 应用程序上方做一个 ref.watch,例如
标签: dart riverpod flutter-hive