Экран не обновляется в виджете с отслеживанием состояния во Flutter

У меня есть statefulWidget во Flutter вот так:

class GameScreen extends StatefulWidget {
  @override
  GameScreenState createState() => GameScreenState();
}

class GameScreenState extends State<GameScreen> {
  List<String> selectedWord = ['h', 'e', 'l', 'l', 'o'];

  Widget _letterInput() {
    return Center(
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          for (var letter in selectedWord) LetterInput(letter: letter)
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          _letterInput(),
        ],
      )),
    );
  }
}

class LetterInput extends StatelessWidget {
  LetterInput({this.letter});

  final String letter;

  @override
  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.fromLTRB(5, 0, 5, 0),
        decoration: BoxDecoration(
            border: BorderDirectional(
                bottom: BorderSide(width: 6.0, color: Colors.green))),
        child: Text(letter,
            textAlign: TextAlign.center,
            style:
                GoogleFonts.acme(fontSize: 28.0, fontWeight: FontWeight.w400)));
  }
}

Проблема в том, что когда я впервые запускаю приложение с этим виджетом, я вижу hello на экране, но если я продолжу и изменю hello к hellos в selectedWord, который не обновляет экран, но все еще показывает мне helloдаже если горячая перезагрузка включена. Мне нужно перезапустить приложение, чтобы оно показало мнеhellos. Как я мог это исправить?

1 ответ

Решение

По моему опыту, горячая перезагрузка сохраняет состояния. Попробуйте вместо этого горячий перезапуск?

Ссылаясь на ваш комментарий, если вы хотите продолжать использовать горячую перезагрузку, я предлагаю вам вытащить переменную из самого виджета (если это вариант для вас), например:

class GameScreen extends StatefulWidget {
  final List<String> selectedWord = ['h', 'e', 'l', 'l', 'o'];

  @override
  GameScreenState createState() => GameScreenState();
}

class GameScreenState extends State<GameScreen> {
  Widget _letterInput() {
    return Center(
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          for (var letter in widget.selectedWord) LetterInput(letter: letter)
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              _letterInput(),
            ],
          )),
    );
  }
}
Другие вопросы по тегам