Flutter Back button with return data

后端 未结 11 1008
长情又很酷
长情又很酷 2020-12-01 15:46

I have an interface with two buttons that pop and return true or false, like so:

onPressed: () => Navigator.pop(context, false)

I need t

相关标签:
11条回答
  • 2020-12-01 16:30

    Try this:

    void _onBackPressed() {
      // Called when the user either presses the back arrow in the AppBar or
      // the dedicated back button.
    }
    
    @override
    Widget build(BuildContext context) {
      return WillPopScope(
        onWillPop: () {
          _onBackPressed();
          return Future.value(false);
        },
        child: Scaffold(
          appBar: AppBar(
            leading: IconButton(
              icon: Icon(Icons.arrow_back),
              onPressed: _onBackPressed,
            ),
          ),
        ),
      );
    }
    
    0 讨论(0)
  • 2020-12-01 16:34

    To pop the data and pass data back on navigation, you need to use .then() from screen 1. Below is the example.

    Screen 2:

    class DetailsClassWhichYouWantToPop {
      final String date;
      final String amount;
      DetailsClassWhichYouWantToPop(this.date, this.amount);
    }
    
    void getDataAndPop() {
          DetailsClassWhichYouWantToPop detailsClass = new DetailsClassWhichYouWantToPop(dateController.text, amountController.text);
          Navigator.pop(context, detailsClass); //pop happens here
      }
    
    new RaisedButton(
        child: new Text("Edit"),
        color:  UIData.col_button_orange,
        textColor: Colors.white,
        onPressed: getDataAndPop, //calling pop here
      ),
    

    Screen 1:

        class Screen1 extends StatefulWidget {
              //var objectFromEditBill;
              DetailsClassWhichYouWantToPop detailsClass;
    
              MyBills({Key key, this.detailsClass}) : super(key: key);
    
              @override
              Screen1State createState() => new Screen1State();
            }
    
            class Screen1State extends State<Screen1> with TickerProviderStateMixin {
    
    
            void getDataFromEdit(DetailsClassWhichYouWantToPop detailClass) {
            print("natureOfExpense Value:::::: " + detailClass.date);
            print("receiptNumber value::::::: " + detailClass.amount);
          }
    
          void getDataFromEdit(DetailsClassWhichYouWantToPop detailClass) {
            print("natureOfExpense Value:::::: " + detailClass.natureOfExpense);
            print("receiptNumber value::::::: " + detailClass.receiptNumber);
          }
    
          void pushFilePath(File file) async {
            await Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => Screen2(fileObj: file),
              ),
            ).then((val){
              getDataFromScreen2(val); //you get details from screen2 here
            });
          }
       }
    
    0 讨论(0)
  • 2020-12-01 16:37

    This may help and work for you

    1st screen

    void goToSecondScreen()async {
     var result = await Navigator.push(_context, new MaterialPageRoute(
     builder: (BuildContext context) => new SecondScreen(context),
     fullscreenDialog: true,)
    );
    
    Scaffold.of(_context).showSnackBar(SnackBar(content: Text("$result"),duration: Duration(seconds: 3),));
    }
    

    2nd screen

    Navigator.pop(context, "Hello world");
    
    0 讨论(0)
  • 2020-12-01 16:39

    First, Remove the automatically appended back button (see this answer)

    Then, create your own back button. like this:

    IconButton(
        onPressed: () => Navigator.pop(context, false),
        icon: Icon(Icons.arrow_back),
        )
    
    0 讨论(0)
  • 2020-12-01 16:39

    Use the below code to get result from your activity.

    Future _startActivity() async {
    
    Map results = await Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context){
      return new StartActivityForResult();
    }));
    
    if (results != null && results.containsKey('item')) {
      setState(() {
        stringFromActivity = results['item'];
        print(stringFromActivity);
      });
    }
    }
    

    Complete Source Code

    import 'package:flutter/material.dart';
    import 'activity_for_result.dart';
    import 'dart:async';
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
     return new MaterialApp(
       title: 'Flutter Demo',
       theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
         home: new MyHomePage(title: 'Start Activity For Result'),
      );
     }
    }
    
    class MyHomePage extends StatefulWidget {
     MyHomePage({Key key, this.title}) : super(key: key);
     final String title;
    
     @override
     _MyHomePageState createState() => new _MyHomePageState();
    }
    class _MyHomePageState extends State<MyHomePage> {
     String stringFromActivity = 'Start Activity To Change Me \n                                                                    
    0 讨论(0)
提交回复
热议问题