【问题标题】:Flutter integrating Hive database with RiverpodFlutter 将 Hive 数据库与 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()),
    );
}

如何使用Riverpod 为Hive 创建提供程序并将其用于HookWidget?

【问题讨论】:

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

标签: dart riverpod flutter-hive


【解决方案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;

      ...
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多