如何将简单数据从“secondpage”发送到“mainpage”(有状态到有状态)

How to send simple data from `secondpage` to `mainpage` (stateful to stateful)

我发现了很多在 statelessstateful[=49 之间传递数据的解决方案=] 小部件,但不在 两个有状态小部件之间

编辑: 我编辑了代码以显示更多详细信息

主页

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()
                ));
              },
            ),
            
          ],
        ),
      ),
    );
  }
}

第二页:

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"
      
    ...
  }

所以基本上我想将 ${_selectedMethod.name} 从 2ndPage 传递到 MainPage。抱歉,我很不擅长解释:(

我假设您有一个 SecondPage-Widget。所以你可以这样做:

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),
    );
  }
}

您可以通过 .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);
  }
}