sqlite - 数据库查询后 Flutter futurebuilder 快照为空,直到热重载
问题描述
我正在查询数据库以在构建方法中填充列表视图,但未来的构建器在第一次运行时在快照中返回 null。它给出 RangeError (index): Invalid value: 有效值范围为空。但是当我按下热重载时,数据正确显示。我认为我无法将快照结果正确映射到 juzlist,请帮助我缺少什么?
@override
Widget build(BuildContext context) {
// TODO: implement build
final makeBody = Container(
decoration: BoxDecoration(
color: light_mode ? Color(0xFFFFEEFF) : Color(0xFF6D6D6D)),
child:FutureBuilder<List<Juz>>(
future: getSurahData(context),
builder:( BuildContext context, AsyncSnapshot<List<Juz>> snapshot){
print(snapshot.data);
if (snapshot.hasData){
return returnListview();
}
else
return Center(child: CircularProgressIndicator());
},
)
);
return Scaffold(
appBar: AppBar());}
Widget returnListview(){
return Column(
textDirection: TextDirection.rtl,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
new Padding(
padding: EdgeInsets.fromLTRB(5, 5, 5, 5),
child: Text("#051",
style: TextStyle(
color: light_mode
? Colors.black
: Colors.white,
fontSize: 30.0,
fontWeight: FontWeight.w100,
fontFamily: 'QCF'),
textDirection: TextDirection.rtl,
textAlign: TextAlign.center)),
new Expanded(
child: SizedBox(
height: 200.0,
child: ListView.builder(
itemCount:
juzlist.length==null? 0: juzlist.elementAt(juzlist.length-1).ayah_no,
itemBuilder: (context, index) {
return Card(
color: light_mode
? Color(0xFFFFEEFF)
: Color(0x8E8E8E),
child: Column(
textDirection: TextDirection.rtl,
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.stretch,
children: <Widget>[
Wrap(
direction: Axis.horizontal,
alignment:
WrapAlignment.start,
runAlignment:
WrapAlignment.center,
textDirection:
TextDirection.rtl,
spacing: 2.0,
// gap between adjacent chips
runSpacing: 5.0,
children: makeSurahListview(
countlist[index]
.surah_no,
countlist[index]
.ayah_no,
countlist[index]
.count)),
]));
})))
]);
}
Future<List<Juz>> getSurahData(BuildContext context) async {
print('surah view');
var jsonText = await rootBundle.loadString('assets/loadjson/surahjuz.json');
newData = json.decode(jsonText);
var chNo = int.parse(widget.itemHolder);
final ajza = newData['Chapters'][chNo - 1]['ajza'];
final ajzaStr = ajza.replaceAll(' ', '');
final split = ajzaStr.split(",");
final Map<int, String> values = {
for (int i = 0; i < split.length; i++) i: split[i]
};
for (int i = 0; i < values.length; i++) {
String dbfile = "p" + values[i] + ".db";
ReadSurahList(dbfile, chNo);
}
return juzlist;
}
ReadSurahList(String dbpath, int chNo) async {
Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, dbpath);
var db = await openDatabase(path, readOnly: true);
result = await db.rawQuery(
"SELECT Uthmani, `Surah-No`,`Ayah-No`, Root, Urdu FROM SHEET1 WHERE `Surah-No`= $chNo");
result.forEach((result) {
Juz juz = Juz.fromMap(result);
juzlist.add(juz);
});
result = await db.rawQuery(
"SELECT Uthmani, `Surah-No`,`Ayah-No`, COUNT(*), MIN(`Row_id`) FROM SHEET1 WHERE `Surah-No`=$chNo group by `Surah-No`,`Ayah-No`");
print(result);
result.forEach((result) {
Juz juz = Juz.fromMap(result);
countlist.add(juz);
});
}
解决方案
调用getSurahData(context)
函数initState
void initState() {
getSurahData(context)
super.initState();
}
推荐阅读
- libgdx - box2d 中的软约束是什么?
- apache-spark - 有没有办法根据 pyspark 中的索引对数据帧进行切片?
- c# - 如何在不单击按钮的情况下直接使用 RadioButtons 和 CheckBoxes 输出到 TexBox
- android - 为什么 IncomingNumber 总是空的?
- javascript - Angular 2 表单验证触碰和脏返回错误,找不到原因
- c# - System.ObservableExtensions.Subscribe:不明确的引用
- azure-cognitive-services - Azure 认知服务 RecognizePrintedText 与 RecognizeText
- postgresql - 返回查询时如何退出plpgsql函数
- java - `DispatcherServlet` 如何从 `GenericServlet` 继承方法
- javascript - 回调函数更改时的addEventListener vs onclick