#dart #flutter
#dart #flutter
Вопрос:
Я пытаюсь получить доступ к переменной ‘updateNotesModel’, объявленной в коде в _UpdateNotesState. Я узнал, что вы можете сделать это, используя ключевое слово ‘widget’, как показано в каркасе ниже. Но проблема здесь в том, что я пытаюсь получить доступ к переменной вне метода сборки, чтобы присвоить TextEditingController значение по умолчанию. Как я могу этого добиться?
class UpdateNotes extends StatefulWidget {
final NotesModel updateNotesModel;
UpdateNotes({Key key, this.updateNotesModel}): super(key: key);
@override
_UpdateNotesState createState() => _UpdateNotesState();
}
class _UpdateNotesState extends State<UpdateNotes> {
TextEditingController _titleController =
new TextEditingController(text: widget.updateNotesModel.someValue); //getting an error
}
@override
Widget build(BuildContext context) {
return Scaffold(
var a = widget.updateNotesModel.someValue
.
.
.
)
}
}
Ответ №1:
Вы можете сделать это в initState
:
class _UpdateNotesState extends State<UpdateNotes> {
TextEditingController _titleController = new TextEditingController();
@override
void initState() {
_titleController.text= widget.updateNotesModel.someValue;
super.initState();
}
}
Комментарии:
1. Привет, спасибо за решение! И еще одна вещь: есть ли способ, с помощью которого я, возможно, могу изменить значение элемента updateNotesModel, даже если flutter заставляет меня инициализировать его как final . Например, widget.updateNotesModel.someValue = newValue?
2. Все в порядке. Эта переменная не должна быть const в родительском виджете. Вы можете
setState
в родительском виджете, а затем flutter перестроить дерево виджетов и повторно инициализировать свой виджет.3. Или, если вы не хотите изменять ее в этом виджете, вы должны сделать
updateNotesModel
часть состояния, а не виджет.4. Еще раз спасибо, я попробую и, надеюсь, смогу с этим разобраться!
Ответ №2:
Теперь вы можете использовать late
ключевое слово. Из документации:
В Dart 2.12 добавлен
late
модификатор, который имеет два варианта использования:
- Объявление ненулевой переменной, которая инициализируется после ее объявления.
- Ленивая инициализация переменной.
class _UpdateNotesState extends State<UpdateNotes> {
late TextEditingController _titleController = new TextEditingController(text: widget.updateNotesModel.someValue);
@override
Widget build(BuildContext context) {
.
.
.
}
}
Ответ №3:
к сожалению, это невозможно сделать, поскольку ключевое слово widget недоступно при инициализации
Комментарии:
1. Принятый ответ двухлетней давности предполагает, что это можно сделать. Этот ответ неверный?
2. @JeremyCaney Я думаю, он имеет в виду, что мы не можем получить доступ к переменной
widget
внутри класса состояния, вне метода сборки или любого другого метода.