首页 > 解决方案 > 数据库查询后 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);
    });

  }

标签: sqlitelistviewflutter-futurebuilderhot-reload

解决方案


调用getSurahData(context)函数initState

void initState() {
  getSurahData(context)
  super.initState();
}

推荐阅读