【发布时间】:2022-01-05 12:59:21
【问题描述】:
尝试从以下位置更改对数据库的访问权限:
只需初始化对数据initState的访问,然后在ListView.builder中显示结果
到
ListView.builder 在FutureBuilder 内。
但是我在这个 FutureBuilder 中迷路了,我的列表是空的。我想我的问题在updateAndGetList() 内部。
在控制台中我得到了这个:
flutter: AsyncSnapshot<List<Word>>(ConnectionState.done, null, , #0 _RandomWordsState.updateAndGetList.<anonymous closure> (package:myapplesson/main.dart:115:7)
有人可以帮助或推动我朝着正确的方向前进吗????
这是我的 main.dart
DatabaseHelper dbHelper = DatabaseHelper.instance;
final _suggestions = <Word>[];
@override
void initState() {
super.initState();
// initial load
_listFuture = updateAndGetList();
}
late Future<List<Word>> _listFuture;
void refreshList() {
// reload
setState(() {
_listFuture = updateAndGetList();
});
}
//I GUESS I AM DOING SOMETHING WRONG HERE!?????????????
Future<List<Word>> updateAndGetList() async {
await DatabaseHelper.instance.database;
// return the list here
return dbHelper.getAllWords().then((rows) {
setState(() {
rows?.forEach((row) { _suggestions.add(Word.map(row));});
});
throw '';
});
}
Widget _buildSuggestions() {
return FutureBuilder<List<Word>>(
future: _listFuture,
builder: (BuildContext context, AsyncSnapshot<List<Word>> snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: _suggestions.length,
itemBuilder: (context, i) {
if (i.isOdd) return const Divider();
final index = i ~/ 2;
if (index >= _suggestions.length) {
_suggestions.addAll(_suggestions.take(10));
}
return _buildRow(_suggestions[index]);
});
}else if (snapshot.hasError) {
return Text("Oops!");
}
return Center(child: CircularProgressIndicator());
},
);
}
Widget _buildRow(Word pair) {
return ListTile(
title: Text(
pair.word1
),
subtitle: Text(
pair.meaning
),
);
}
在更改完成之前,一切都是这样进行的:
//perfectly worked????
@override
void initState() {
super.initState();
dbHelper.getAllWords().then((rows) {
setState(() {
rows?.forEach((row) { _suggestions.add(Word.map(row));});
});
});
}
Widget _buildSuggestions() {
return ListView.builder(
itemCount: _suggestions.length,
itemBuilder: (context, i) {
if (i.isOdd) return const Divider();
final index = i ~/ 2;
if (index >= _suggestions.length) {
_suggestions.addAll(_suggestions.take(10));
}
return _buildRow(_suggestions[index]);
});
}
Widget _buildRow(Word pair) {
return ListTile(
title: Text(
pair.word1
),
subtitle: Text(
pair.meaning
),
);
}
这是我的 Database_helper.dart
...
Future<List<Map<String, dynamic>>?> getAllWords() async {
Database? db = await instance.database;
var result = await db?.query(table);
return result?.toList();
}
...
【问题讨论】:
标签: flutter dart sqflite flutter-futurebuilder