Как правильно инициализировать базу данных sembast для доступа на разных экранах? - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь создать приложение, которое использует базу данных Sembast для локального хранения данных, но у меня возникла проблема, когда я выхожу и снова вхожу в экран DatabaseScreen. Я получаю сообщение об ошибке, когда пытаюсь повторно войти на экран, и я не уверен, что это из-за:

final Future _init = Init.initialize();

или

LocalRepository _localRepository = GetIt.I.get();

Есть ли лучший способ инициализировать базу данных (как в файле main.dart во время загрузки), чтобы я мог получить к ней доступ на разных страницах приложения? Нужно ли мне также закрывать базу данных при закрытии приложения?

Функция инициализации ниже:

class Init {
  static Future initialize() async {
    //initialize Sembast database
    final appDir =
        await getApplicationDocumentsDirectory(); //find the file path to save files
    await appDir.create(recursive: true);
    final databasePath =
        join(appDir.path, "sembast.db"); //merges database name to filepath
    final database = await databaseFactoryIo.openDatabase(databasePath);
    GetIt.I.registerSingleton<Database>(
        database); //registers the database to be accessed later

    //register Repository
    GetIt.I
        .registerLazySingleton<LocalRepository>(() => SembastLocalRepository());
  }
}

Экран DatabaseScreen, на котором вызывается функция инициализации:

class DatabaseScreen extends StatefulWidget {
  static const routeName = '/database_screen';
  @override
  _DatabaseScreenState createState() => _DatabaseScreenState();
}

class _DatabaseScreenState extends State<DatabaseScreen> {
  final Future _init = Init.initialize();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Activity Log',
      home: FutureBuilder(
        future: _init,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return DatabaseHelpScreen();
          } else {
            return Material(
              child: Center(
                child: CircularProgressIndicator(),
              ),
            );
          }
        },
      ),
    );
  }
}

Вспомогательный класс, в котором создается локальный репозиторий:

class DatabaseHelpScreen extends StatefulWidget {
  @override
  _DatabaseHelpScreenState createState() => _DatabaseHelpScreenState();
}

class _DatabaseHelpScreenState extends State<DatabaseHelpScreen> {
  LocalRepository _localRepository = GetIt.I.get();

  List<Activity> _activities = [];
  List<Outcome> _outcomes = [];
  List<UserPreferences> _userPref = [];

  @override
  void initState() {
    super.initState();
    _loadActivities();
    _loadOutcomes();
  }

...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...