Я не могу обновить данные из Sqflite во Flutter (widget.id проблема)

#sqlite #flutter #dart

#sqlite #flutter #dart

Вопрос:

Я нашел причину проблемы с обновлением с помощью Sqlite. Это связано с widget.id функцией in void. Поскольку функция не является виджетом, она 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);
  }
  

Комментарии:

1. Я предполагаю, что вы передаете идентификатор с другой страницы? Перед передачей убедитесь, что идентификатор не равен нулю.

2. @JohnJoe о, они находятся в одном классе, и я передавал таблицу sqlite из функции в функцию. Вот почему я не могу использовать widget.id , но я понятия не имею, как изменить widget.id в другой. идентификатор, voca.id, this.id не работают. Знаете ли вы решение по этому поводу?

3. Не совсем понимаю, чего вы пытаетесь здесь достичь. Вы хотите передать идентификатор из editPage в updateDB ?

4. @JohnJoe Ты прав! Если быть точным, vocaBuilder(voca.id) => editPage(id) => updateDB(???) я добавил дополнительный код, чтобы помочь вам понять.

Ответ №1:

Вы можете передать id из editPage в updateDB .

 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);
       ..... 
}
  

Комментарии:

1. Но если мне это нравится, разве невозможно привести другие данные — this.word, this.meaning?