Передача данных с одного экрана на другой во Флаттере является нулевой - PullRequest
0 голосов
/ 13 июня 2019

У меня два экрана, с одного я хочу передать строку заголовка на другой экран. Этот заголовок можно войти или зарегистрироваться, предварительно решив на первом экране. Что я пробовал:

Container(
  child: RaisedGradientButton(
    onPressed: () {
      print('Login clicked');
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => 
            MyApp(
              formMode: FormMode.LOGIN, 
              screenTitle: "Login",
            )
        ),
      );
    }, 
    textButton: "Login", 
    height: 55, 
    width : 200.0, 
    buttonTitleColor: Colors.white, 
    buttonBackgroundColor: Colors.red,
  )
),

Ниже показан второй экран с этапами инициализации:

enum FormMode { LOGIN, SIGNUP }

void main() {
  runApp(
    MaterialApp(
      home: StatelessLanding(),
    ),
  );
}

class MyApp extends StatelessWidget{
  // In the constructor, require a Todo
  final FormMode formMode;
  final String screenTitle;

  MyApp({Key key, @required this.formMode, @required this.screenTitle}) 
    : super(key: key);

  @override
  Widget build(BuildContext context){
    return MyAppStateFul();
  }
}

class _MyAppStateFulState extends State<MyAppStateFul> {
  FormMode formMode;
  String screenTitle;

  _MyAppStateFulState(FormMode formMode, String screenTitle) {
    this.formMode = formMode;
    this.screenTitle = screenTitle;
  }
}

Это место, где я использую заголовок экрана:

@override
Widget build(BuildContext context) {
  var screenTitle = "Login";
  print('screen title is $widget.screenTitle');
  print('screen title is $this.screenTitle');
  print('screen title is $screenTitle');
}

Может эксперты, пожалуйста, помогите мне. Спасибо

1 Ответ

0 голосов
/ 13 июня 2019

Код немного сложен для отслеживания, однако похоже, что вы забыли передать screenTitle из класса MyApp в виджет MyAppStateful.

В приведенном выше коде у вас есть следующий виджет без сохранения состояния:

class MyApp extends StatelessWidget{
  // In the constructor, require a Todo
  final FormMode formMode;
  final String screenTitle;

  MyApp({Key key, @required this.formMode, @required      this.screenTitle}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MyAppStateFul();
  }
}

Мне кажется, вам придется передать screenTitle в конструктор MyAppStateFul, чтобы сделать его доступным в виджете с состоянием, например:

  @override
  Widget build(BuildContext context) {
    return MyAppStateFul(screenTitle);
  }

Конечно, это также требует, чтобы вы изменили конструктор MyAppStateFul, чтобы он принимал параметр screenTitle, если он этого еще не сделал.

Я думаю, это должно исправить это для вас.

...