Как получить доступ к переменной виджета с сохранением состояния внутри класса состояния вне метода сборки?

#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 внутри класса состояния, вне метода сборки или любого другого метода.