Flutter: как передать переменные из StatelessWidget в StatefulWidget

Проблема в том, что я не могу передать значения моего собственного класса ForceSelection с другого экрана на StatefulWidget другого экрана. Он отлично работает в StatelessWidget. Я пытался извлечь уроки из этого учебника по флаттеру: https://flutter.dev/docs/cookbook/navigation/passing-data#4-navigate-and-pass-data-to-the-detail-screen

У меня есть такой класс в levelSelection.dart

class ForceSelection {
  final String forceSelection;
  final String langSelection;

  ForceSelection(this.forceSelection, this.langSelection);
}

Я пытаюсь передать значения в следующий файл PlayQuiz.dart

Game(forceSelection: ForceSelection('maa', 'fin'))

game.dart выглядит так:

class Game extends StatelessWidget {
  final ForceSelection forceSelection;

  Game({Key key, @required this.forceSelection}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: forceSelection.langSelection, // TODO should work and change later
      theme: new ThemeData(
        primaryColor: Colors.white,
      ),
      home: PlayQuiz(),
    );
  }
}

И я хочу передать значения ForceSelection в PlayQuiz().

class PlayQuizState extends State<PlayQuiz> {
  Game.forceSelection // <--- How can I get the value out of here?
}

class PlayQuiz extends StatefulWidget {
  @override
  PlayQuizState createState() => new PlayQuizState(); 
}

Весь код можно найти здесь: https://pastebin.com/nKssz42R а также levelSelection.dart: https://pastebin.com/8QbBD0A2

Вы хотите перейти от родителя -> ребенка или ребенка -> родителя?

user1462442 03.04.2019 18:57

Сработало ли мое решение для вас.

Mangaldeep Pannu 07.04.2019 14:29
3
2
13 649
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте этот код

Добавлен аргумент forceSeleton в PlayQuiz().

class Game extends StatelessWidget {
final ForceSelection forceSelection;

Game({Key key, @required this.forceSelection}) : super(key: key);

@override
Widget build(BuildContext context) {
  return MaterialApp(
    title: forceSelection.langSelection, // TODO should work and change later
    theme: new ThemeData(
      primaryColor: Colors.white,
    ),
    home: PlayQuiz(forceSelection),
  );
 }
}

Викторина в игре

class PlayQuiz extends StatefulWidget {
  final ForceSelection forceSelection;

  PlayQuiz(this.forceSelection);

  @override
  PlayQuizState createState() => new PlayQuizState(forceSelection); 
}

In PlayQuizState

class PlayQuizState extends State<PlayQuiz> {
  ForceSelection forceSelection;

  PlayQuizState(ForceSelection forceSelection) {
    this.forceSelection = forceSelection;
  }
}

Другие вопросы по теме