Flutter 将 Hive 数据库与 Riverpod 集成

Dol*_*rma 2 dart riverpod flutter-hive

Hive在 上使用键值数据库有非常简单的方法StatefulWidgets,例如:

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),
      ),
      ...
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里我们定义了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()),
    );
}
Run Code Online (Sandbox Code Playgroud)

我如何为Hivewith创建一个提供程序Riverpod并将其用于HookWidget

ccn*_*brn 10

我像这样将 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');
  }

}
Run Code Online (Sandbox Code Playgroud)

在 ConsumerWidget 中使用:

class SomeWidget extends ConsumerWidget {

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

      ...
  }

}
Run Code Online (Sandbox Code Playgroud)