首页 > 解决方案 > 我无法在 Flutter 中更新来自 Sqflite 的数据(widget.id 问题)

问题描述

我使用 Sqlite 找到了更新问题的原因。它与widget.idvoid 函数有关。因为函数不是小部件,所以widget.id总是被调用null。有没有办法解决它或可以用来代替的东西widget.id?提前致谢。

Widget vocaBuilder() {
    return FutureBuilder(
        builder: (context, snap) {
            return ListView.builder(
                shrinkWrap: true,
                physics: const NeverScrollableScrollPhysics(),
                itemCount: snap.data.length,
                scrollDirection: Axis.vertical,
                itemBuilder: (context, index) {
                  Voca voca = snap.data[index];

                  return GestureDetector(
                      onTap: () {
                        editPage(voca.id);
                      },
                  ...
}


void editPage(String id){
...
 Padding(
         padding:
           EdgeInsets.only(top: 20, left: 270, bottom: 5),
               child: FlatButton(
                      child: Text('update', 
                                 style: TextStyle(fontSize: 22,
                                        fontWeight: FontWeight.w800)),
                      onPressed: () {
                                 setState(() {
                                 updateDB();
                                    });
                      })),
                     FutureBuilder<List<Voca>>(
                            future: loadEditVoca(id),
                            builder: (BuildContext context,
                                AsyncSnapshot<List<Voca>> snapshot) {
                              if (snapshot.data == null ||
                                  snapshot.data == []) {
                                return Container();
                              } else {
                                Voca voca = snapshot.data[0];

                                word = voca.word;
                                final TextEditingController tecWord =
                                    TextEditingController();

                                tecWord.text = voca.word;
                                final TextEditingController tecMeaning =
                                    TextEditingController();

                                tecMeaning.text = voca.meaning;
                                meaning = voca.meaning;
                                createTime = voca.createTime;
                                ....
                  )));
          });
        });
  }
}

Future<void> updateDB() async {
    DBHelper sd = DBHelper();

    var fido = Voca(
        id: widget.id,// => always null. need to fix it.
        word: this.word,
        meaning: this.meaning,
        createTime: this.createTime);
    await sd.updateVoca(fido);
    print(await sd.vocas());
    Navigator.pop(_context);
  }

标签: sqliteflutterdart

解决方案


你可以ideditPageupdateDB

updateDB(id);

并为您的updateDB功能

Future<void> updateDB(String id) async {
       ...
   var fido = Voca(
        id: id, // =>  use the id parameter
        word: this.word,
        meaning: this.meaning,
        createTime: this.createTime);
       ..... 
}

推荐阅读