Если это поможет, вот мой рабочий код.Примечание. Я использую async getter для дБ и await при использовании db в методе.Боюсь, я тоже новичок во Флаттере.
Примечание. Я взаимодействую с DatabaseHelper через Future.Смотрите второй блок кода.Я думаю, что это требует использования FutureBuilder .Я подозреваю, что вам нужно использовать это, чтобы справиться с (немного) медленными загрузками асинхронных вызовов БД.
class DatabaseHelper {
final String tableName = "Gear";
static Database _db;
Future<Database> get db async {
if (_db != null) return _db;
_db = await initDb();
await importData();
return _db;
}
initDb() async {
// Get a location using path_provider
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, "gear_log.db");
await deleteDatabase(path);
var theDb = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async {
print('creating db...');
String sql = await rootBundle.loadString('assets/db/schema.txt');
for (var s in sql.split(";")) {
if (s.length > 5) {
// catching any hidden characters at end of schema
await db.execute(s + ';');
}
}
// When creating the db, create the table
});
return theDb;
}
importData() async {
final datasources =
'observation_bodyissue.json,observation_observation.json,observation_observation_bodyIssues.json,observation_observation_shoeIssues.json,observation_shoeissue.json,observation_gearissue.json,runner_runner.json,gear_actualpair.json,gear_characteristic.json,gear_shoe.json,gear_family.json,gear_maker.json,gear_gear.json,gear_gear_characteristics.json,users_user.json'
.split(',');
var batch = _db.batch();
for (var datasource in datasources) {
try {
String str = await rootBundle.loadString('assets/db/data/$datasource');
String table = datasource.split('.')[0];
if (str.length > 0 && str != '[]') {
List<dynamic> _list = await json.decode(str);
for (var _json in _list) {
batch.insert(table, _json);
}
}
} catch (e) {
print(e.toString());
}
}
print('added db data');
var results = await batch.commit();
//print(results);
//print('imported data');
}
Future<List<Item>> getItems() async {
var dbClient = await db;
List<Map> list = await dbClient.rawQuery('SELECT *'
'FROM "gear_actualpair" '
'DESC, "gear_actualpair"."created" DESC');
//prob need to specify 'first X' at sometime
List<Item> items = new List();
for (int i = 0; i < list.length; i++) {
Item item = Item.fromMap(list[i]);
if (list[i]['selected'] == 1) {
item.observations = await getObservations(list[i]['id']);
}
items.add(item);
}
return items;
}
}
Взаимодействие с классом dbHelper:
Future<List<Item>> fetchItemsFromDatabase() async {
var dbHelper = DatabaseHelper();
Future<List<Item>> items = dbHelper.getItems();
return items;
}