#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?