Как использовать параметры виджета с отслеживанием состояния в классе состояния при построении без добавления виджета в дерево?

#flutter #dart

Вопрос:

Я столкнулся с проблемой, когда мне нужно использовать параметр StatefulWidget в его классе состояния при его создании, но я не смог найти способ сделать это, поскольку использование widget.[whatever variable name] в конструкторе класса состояния возвращает неожиданное нулевое значение, а функция initState запускается только при выводе виджета на экран.

Например:

 import 'package:flutter/material.dart';

class Test extends StatefulWidget {
  final String text;
  Test(this.text);

  final state = _TestState();
  @override
  _TestState createState() => state;
}

class _TestState extends State<Test> {
  String? changingText;

  void updateChangingText(String moreText){
      changingText = changingText!   moreText;
  }

  @override
  void initState() {
    super.initState();

    changingText = widget.text;
  }

  @override
  Widget build(BuildContext context) {
    return Text(changingText!);
  }
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var w = Test('test');
    w.state.updateChangingText(' text');

    return MaterialApp(home: Scaffold(body: 
      Test('test text')
    ));

  }
}

void main() {
  runApp(App());
}
 

Это не работает, так как changingText обновляется до того, как initState присвоит ему начальное значение, поскольку он запускается только тогда, когда текст выводится на экран, и это:

импорт ‘упаковка:флаттер/материал.дротик’;

 class Test extends StatefulWidget {
  final String text;
  Test(this.text);

  final state = _TestState();
  @override
  _TestState createState() => state;
}

class _TestState extends State<Test> {
  String? changingText;

  void updateChangingText(String moreText){
      changingText = changingText!   moreText;
  }

  _TestState(){
    changingText = widget.text;
  }

  @override
  Widget build(BuildContext context) {
    return Text(changingText!);
  }
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var w = Test('test');
    w.state.updateChangingText(' text');

    return MaterialApp(home: Scaffold(body: 
      Test('test text')
    ));

  }
}

void main() {
  runApp(App());
}
 

тоже не работает, так как вы не можете использовать виджет.[что угодно] в конструкторах классов состояний (по какой-то причине).

Итак, что я могу сделать, чтобы использовать параметры виджета в классе состояния до того, как виджет отобразится на экране?

Заранее спасибо за помощь

Ответ №1:

Для этого следует использовать метод initState, присутствующий в состоянии, вместо конструктора

 @override
void initState() {
  changingText = widget.text;
  super.initState();
}
 

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

1. Как указано выше, в моем случае это не работает, так как initState вызывается только при добавлении виджета в дерево. И я мог бы, как в приведенном выше примере, захотеть использовать параметры «виджет.***» перед выводом виджета на экран