Home > OS >  How to call a future function from a different class?
How to call a future function from a different class?

Time:11-30

I have two classes MainScreen and SearchScreen which uses nested function with a boolean value For example, here in MainScreen, I have a function showMap, its return value is obtained from SearchScreen

Future showMap(bool checkValue) async {
        try {
            //do something
        }
        //somewhere in the widgets 
        @override
        Widget build(BuildContext context) {
            super.build(context);
            //
            GestureDetector(
                onTap: () async {
                    await Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: (context) => SearchScreen(
                                showMapFunction: showMap)));)
            }
        }

NoW in my SearchScreen I have

class SearchScreen extends StatefulWidget {
    final Function showMapFunction;
  

    const SearchScreen({
        this.showMapFunction
    }); //,this.String});

    @override
    _SearchScreenState createState() => _SearchScreenState();
}
///
@override
@mustCallSuper
Widget build(BuildContext context) {
    GestureDetector(
        onTap: () async {
            Navigator.pop(
                //send back data
                // context,
                widget.showMapFunction(true));

        },
        child: Icon(Icons.arrow_back)),
}

This works fine, when I navigate back to MainScreen the function showMap is called, Is there any other way to do this perhaps with provider package or sth? This causes a lot of rebuilds to my widget tree.

CodePudding user response:

What you can do is to await the result of the navigator, like the one used in the Flutter Cookbook.

  void _navigateToSearch(BuildContext context) async {
 
    final result = await Navigator.push(
      context,
       MaterialPageRoute(
                        builder: (context) => SearchScreen())),
    );
  }

And then, when you pop the Search Screen, do the following

 GestureDetector(
  onTap: () async => Navigator.pop(true),
  child: Icon(Icons.arrow_back),
),

I also suggest using WillPopScope.

  • Related