Flutter calling child class function from parent class

前端 未结 4 1349
生来不讨喜
生来不讨喜 2021-01-04 04:01

Code:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(         


        
相关标签:
4条回答
  • 2021-01-04 04:40

    Actually, you can't do that because _HomePageState is private. Delete the _ symbol ahead of HomePageState, so it will be public and you can call methodA() using the HomePageState().methodA();

    0 讨论(0)
  • 2021-01-04 04:48

    The above answer did not work for me, instead i just replaced the global key and it worked very well:

    class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
     return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          leading: IconButton(
            icon: Icon(Icons.help),
            onPressed: () {
             //call it like this:
             HomePage.globalKey.currentState.methodA();
            },
          ),
        ),
        body: HomePage(),
      ),
    );
     }
    }
    
    
    class HomePage extends StatefulWidget {
    //Add this key like this:
    static final GlobalKey<_HomePageState> globalKey = GlobalKey();
    super(key: globalKey);
    
    @override
     _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
     @override
      Widget build(BuildContext context) {
      return Container();
     }
    
     void methodA() {}
    }
    

    Hope everything is working:)

    0 讨论(0)
  • 2021-01-04 04:52

    I think the best practice in this case is using the way that the programmers of the Flutter used themselves!

    Bellow code is an example from Flutter source. As you can see there in MyCustomForm widget if you want to access the text property of TextField widget (which is the child of MyCustomForm widget in this example) you need to use its controller like this...

    class _MyCustomFormState extends State<MyCustomForm> {
      ...
      final myController = TextEditingController();
      ...
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          ...
          body: TextField(
            controller: myController,
          ),// TextField
          ...
          floatingActionButton: FloatingActionButton(
            ...
            onPressed: () {
              print(myController.text);
            },
            ...
          ),// FloatingActionButton
        );
      }
    }
    

    Now be inspired by this and also knowing the fact that Flutter pass its object parameters by reference so we need a controller class for our child class to be able to access child's fields and functions through the controller object (like the TextField widget in previous example)...in your case we can do it like this:

    class HomePageController {
      void Function() methodA;
    }
    
    class MyApp extends StatelessWidget {
    
      final HomePageController myController = HomePageController();
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              leading: IconButton(
                icon: Icon(Icons.help),
                onPressed: () {
                  myController.methodA();
                },
              ),// IconButton
            ),// AppBar
            body: HomePage(
              controller: myController,
            ),// HomePage
          ),
        );
      }
    }
    
    class HomePage extends StatefulWidget {
    
      final HomePageController controller;
    
      HomePage({ this.controller });
    
      @override
      _HomePageState createState() => _HomePageState(controller);
    }
    
    class _HomePageState extends State<HomePage> {
    
      _HomePageState(HomePageController _controller) {
        _controller.methodA = methodA;
      }
    
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    
      void methodA() {}
    }
    

    As can be seen in this code myController's reference passes through HomePage to reach the _HomePageState's constructor and then gets the reference of methodA function... and now methodA is accessible in MyApp class via myController!

    Hope it Helps! :))

    0 讨论(0)
  • 2021-01-04 04:53

    Thanks to Günter Zöchbauer for pointing me in right direction. I am using GlobalKey to get the things done. However use GlobalKey with care

    GlobalKey<_HomePageState> globalKey = GlobalKey();
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              leading: IconButton(
                icon: Icon(Icons.help),
                onPressed: () {
                 globalKey.currentState.methodA();
                },
              ),
            ),
            body: HomePage(key: globalKey),
          ),
        );
      }
    }
    class HomePage extends StatefulWidget {
      HomePage({Key key}) : super(key: key);
    
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    
      void methodA() {}
    }
    
    0 讨论(0)
提交回复
热议问题