首页 > 解决方案 > 在 BLoC 中打开数据库表,在 MyApp 中处理 - 这有效吗?

问题描述

我正在使用Hive数据库并想box在会话 BLoC 中打开一个(又名表)。在我看来,这比使用FutureBuilderinmyApp()或类似的更合理。

现在,hive 团队建议在应用退出时关闭一个表(“在你的应用退出之前,你应该调用 Hive.close() 来关闭所有打开的盒子。”)。这样做是否有效,或者是否应该出于某种(哪个)原因在同一个小部件中进行打开和关闭?

class App extends StatelessWidget {
  const App({
    required this.authenticationRepository,
    required this.userRepository,
    required this.sessionRepository,
  }) : super(key: key);

  final AuthenticationRepository authenticationRepository;
  final UserRepository userRepository;
  final SessionRepository sessionRepository;

  @override
  Widget build(BuildContext context) {
    return RepositoryProvider.value(
        value: authenticationRepository,
        child: MultiBlocProvider(
        providers: [
          BlocProvider(
            create: (_) => AuthenticationBloc(
              authenticationRepository: authenticationRepository,
              userRepository: userRepository,
          ) ),
// *** IN THE BLOC BELOW I AM OPENING THE BOX AKA DATA TABLE WITH
// *** await Hive.openBox('problemMasterData');
          BlocProvider(
            create: (_) => SessionBloc()
            ),
        ],
        child: AppView(),
    ));
  }
}


class AppView extends StatefulWidget {
  @override
  _AppViewState createState() => _AppViewState();
}

class _AppViewState extends State<AppView> {
  @override
  Widget build(BuildContext context) {
    return PlatformApp( 
      cupertino: (_, __) => CupertinoAppData(theme: HomeThemeCupertino.lightHomeTheme), 
      initialRoute: '/',
      onGenerateRoute: AppRoutes.generateRoutes,
      ],
      builder: (context, child) {
        return BlocListener<AuthenticationBloc, AuthenticationState>(
          listener: (context, state) {
            switch (state.status) {
              case AuthenticationStatus.authenticated:
                _navigator.pushNamedAndRemoveUntil('/home', (route) => false);
                break;
              case AuthenticationStatus.unauthenticated:
                _navigator.pushNamedAndRemoveUntil('/login', (route) => false);
                break;
              default:
                break;
            }
          },
          child: child,
        );
      },
    );
  }
// *** AND HERE I WANT TO CLOSE THE BOX
  @override
  void dispose() {
    Hive.box('problemMasterData');
    super.dispose();
  }
}

标签: flutterdisposeblocflutter-hive

解决方案


推荐阅读