Receive Response from pop navigator in Flutter

前端 未结 2 737
情深已故
情深已故 2021-01-28 04:38

Here is a simple example of code that navigator push for a form called. and pop for an answer. my goal is to make a pop of an object, not a string, but keeping it that simple st

相关标签:
2条回答
  • 2021-01-28 04:53

    And here is a code if you want to pass a data object and not a String:

    main.dart:

    import 'package:flutter/material.dart';
    
    import 'answer.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final appTitle = 'Form Validation Demo';
    
        return MaterialApp(
          title: appTitle,
          home: Scaffold(
            appBar: AppBar(
              title: Text(appTitle),
            ),
            body: ShowData(),
          ),
        );
      }
    }
    
    // Create a Form widget.
    class MyCustomForm extends StatefulWidget {
      @override
      MyCustomFormState createState() {
        return MyCustomFormState();
      }
    }
    
    // Create a corresponding State class.
    // This class holds data related to the form.
    class MyCustomFormState extends State<MyCustomForm> {
      // Create a global key that uniquely identifies the Form widget
      // and allows validation of the form.
      //
      // Note: This is a GlobalKey<FormState>,
      // not a GlobalKey<MyCustomFormState>.
      final _formKey = GlobalKey<FormState>();
      final myController = TextEditingController();
      Data stateData = Data();
      @override
      void dispose() {
        // Clean up the controller when the widget is disposed.
        myController.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        // Build a Form widget using the _formKey created above.
        return Scaffold(
          body: Form(
            key: _formKey,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                TextFormField(
                  controller: myController,
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Please enter some text';
                    }
                    return null;
                  },
                  onSaved: (value){
                    stateData.load = value;
                  },
                ),
                Padding(
                  padding: const EdgeInsets.symmetric(vertical: 16.0),
                  child: RaisedButton(
                    onPressed: () {
                      // Validate returns true if the form is valid, or false
                      // otherwise.
                      if (_formKey.currentState.validate()) {
                        _formKey.currentState.save();
                        // If the form is valid, display a Snackbar.
                        Navigator.pop(context,stateData);
    //                  Scaffold.of(context)
    //                      .showSnackBar(SnackBar(content: Text(myController.text)));
    //                    myController.text = 'look at me';
                      }
                    },
                    child: Text('Submit'),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    class Data {
      String load;
    }
    

    answer.dart:

    import 'package:flutter/material.dart';
    
    import 'main.dart';
    
    class ShowData extends StatefulWidget {
    
      @override
      _ShowDataState createState() => _ShowDataState();
    }
    
    class _ShowDataState extends State<ShowData> {
      String data = 'start';
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            floatingActionButton: FloatingActionButton(onPressed:   () async {
              final holder = await  getFormData(context);
              setState(() {
                data = holder.load;
              });
            },
            elevation: 4,
    
            ),
            body:Text(data,style: TextStyle(fontSize: 80),));
      }
    
      Future<Data> getFormData(BuildContext context) async {
        final answer =  await Navigator.push(context,MaterialPageRoute(builder: (context)=>MyCustomForm()));
            return (Future.value(answer));
      }
    }
    
    0 讨论(0)
  • 2021-01-28 05:14

    Add await to receive the result from Future and return the value;

       Future<String> getFormData(BuildContext context) async {
        final result = await Navigator.push(
            context, MaterialPageRoute(builder: (context) => MyCustomForm()));
        return Future.value(result);
      }
    

    Modify the FloatingActionButton onPressed code to receive Future String

    onPressed: () async {
                final value = await getFormData(context);
                setState(() {
                  data = value;
                });
              },
    
    0 讨论(0)
提交回复
热议问题