【问题标题】:Flutter futurebuilder snapshot is null after database query until hot reload数据库查询后 Flutter futurebuilder 快照为空,直到热重载
【发布时间】:2021-08-21 02:12:48
【问题描述】:

我正在查询数据库以在构建方法中填充列表视图,但未来的构建器在第一次运行时在快照中返回 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);
    });

  }

【问题讨论】:

    标签: sqlite listview flutter-futurebuilder hot-reload


    【解决方案1】:

    initState中调用getSurahData(context)函数

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

    【讨论】:

    • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。
    猜你喜欢
    • 2020-04-12
    • 2021-12-26
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2020-07-20
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多