Я пытаюсь создать приложение, которое использует базу данных 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();
}
...
}