Как отправить простые данные из `secondpage` на` mainpage` (с сохранением состояния с сохранением состояния) - PullRequest
1 голос
/ 11 марта 2020

Я нашел много решений для передачи данных между без состояний и с состоянием виджет, но не между два виджета с состоянием

РЕДАКТИРОВАТЬ: я отредактировал код, чтобы показать более подробную информацию

MainPage

class MainPage extends StatefulWidget {
  final String name;
  MainPage({Key key, this.name}) : super(key: key);

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

class _MainPageState extends State<MainPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(      
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("Text from 2nd page -> "), //should return "Text from 2nd page -> BATMAN"
            FloatingActionButton(
              child: Icon(Icons.android),
              onPressed: (){
                Navigator.push(context, MaterialPageRoute(
                    builder: (context) => SecondPage()
                ));
              },
            ),
            
          ],
        ),
      ),
    );
  }
}

MainPage screenshot

SecondPage:

class SecondPage extends StatefulWidget {
  SecondPage({Key key}) : super(key: key);

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

class _SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      ...
      
      Text("I choose ${_selectedMethod.name}"), // this returned "I choose BATMAN"
      
    ...
  }

SecondPage screenshot

Так что в основном я хочу передать ${_selectedMethod.name} из 2ndPage в MainPage. извините, я так плохо объясняю: (

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Переменные можно передать обратно на предыдущую страницу в стеке навигатора, отправив их с помощью метода .pop() и ожидая их на предыдущей странице с помощью метода .then():

class MainPage60643815 extends StatefulWidget {
  @override
  _MainPage60643815State createState() => _MainPage60643815State();
}

class _MainPage60643815State extends State<MainPage60643815> {
  String displayTextFromSecondPage = '';

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Test from second page: '),
              Text(displayTextFromSecondPage),
            ],
          ),
          RaisedButton(
            onPressed: goToSecondPage,
            child: Text('Go to 2nd Page'),
          ),
        ],
      ),
    );
  }

  void goToSecondPage(){
    Navigator.of(context).push(MaterialPageRoute(
      builder: (context) {
        return SecondPage60643815(text: displayTextFromSecondPage);
      }
    )).then((valueFromSecondPage){
      setState(() {
        displayTextFromSecondPage = valueFromSecondPage;
      });
    });
  }
}

class SecondPage60643815 extends StatefulWidget {
  final String text;

  SecondPage60643815({this.text});

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

class _SecondPage60643815State extends State<SecondPage60643815> {
  TextEditingController _textEditingController;

  @override
  void initState() {
    _textEditingController = TextEditingController(
      text: widget.text,
    );
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: goToFirstPage,
        ),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              TextFormField(
                controller: _textEditingController,
                autofocus: true,
              ),
            ],
          ),
        ),
      ),
    );
  }

  void goToFirstPage(){
    Navigator.of(context).pop(_textEditingController.text);
  }
}
0 голосов
/ 11 марта 2020

Я предполагаю, что у вас есть SecondPage -виджет. Таким образом, вы можете сделать что-то вроде:

class _MainPageState extends State<MainPage> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: SecondPage('BATMAN'),
    );
  }
}

Это может напечатать нужный текст "BATMAT".

РЕДАКТИРОВАТЬ

Это может быть ваш SecondPage Виджет:

class SecondPage extends StatefulWidget {
  final String selection;

  SecondPage(this.selection);

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

class _SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
    return Container(
       child: Text(widget.selection),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...