How to call method from another class in Flutter(Dart)?

后端 未结 3 1051
慢半拍i
慢半拍i 2020-12-28 19:47

I have created an Homepage and from that user can sign in for the app and in the next screen user can see their profile info(Only profile name) and under that their is signO

相关标签:
3条回答
  • 2020-12-28 20:21

    you can create another logout() function and give context of home to push back to sign in screen/home screen , works for me as :

          logout() async {
            await googleSignIn.signOut();
            Navigator.push(context, MaterialPageRoute(builder: (context) => Home()));
          }
    
    0 讨论(0)
  • 2020-12-28 20:22

    You must be careful with what you are trying to do because you might be accessing a page/widget that is not mounted. Imagine you do a pushReplacement(new MaterialPageroute(...)). The previous page is no longer available in the tree so you can't access it nor any of its methods.

    Unless you have a clear parent child relationship in your tree, you should abstract away your logic to external or business logic classes. Thus you are sure that you are calling active instances of your classes.

    Here is an example of what you could use passing around the Business object. It would be even better if you use other patterns like BLOC, ScopedModel, Streams, etc. But for the sake of simplicity I think this should be enough.

    import "package:flutter/material.dart";
    
    void main() {
      runApp(MyApp(new Logic()));
    }
    
    class Logic {
      void doSomething() {
        print("doing something");
      }
    }
    
    class MyApp extends StatelessWidget {
      final Logic logic;
    
      MyApp(this.logic);
    
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          home: new HomePage(widget.logic),
        );
      }
    }
    
    class HomePage extends StatelessWidget {
      final Logic logic;
    
      HomePage(this.logic);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: FlatButton(
              onPressed: () { Navigator.of(context).pushReplacement(
                 MaterialPageRoute(
                   builder: (context) => AnotherPage(logic),
                 ))},
              child: Text("Go to AnotherPage"),
            ),
          ),
        );
      }
    }
    
    class AnotherPage extends StatelessWidget {
      final Logic logic;
    
      AnotherPage(this.logic);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: FlatButton(
              onPressed: logic.doSomething,
              child: Text("Press me"),
            ),
          ),
        );
      }
    }
    

    If you still want to call a function in the other Page and you are sure the page is mounted (you have done a push instead of a pushReplacement) you could do the following. (handle with care)

    class HomePage extends StatelessWidget {
    
      HomePage();
    
      void onCalledFromOutside() {
        print("Call from outside");
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
        child: FlatButton(
              onPressed: () { Navigator.of(context).push(
                 MaterialPageRoute(
                   builder: (context) => AnotherPage(onCalledFromOutside),
                 ))},
              child: Text("Go to AnotherPage"),
            ),
          ),
        );
      }
    }
    
    class AnotherPage extends StatelessWidget {
      final Function callback
    
      AnotherPage(this.callback);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
        child: FlatButton(
               onPressed: callback,
               child: Text("Press me"),
            ),
          ),
        );
      }
    }
    
    0 讨论(0)
  • 2020-12-28 20:22

    Import HomePage class in DetailsPage and make a new instance out of it, then call the method you want if it's a public one.

    0 讨论(0)
提交回复
热议问题