从外部状态调用导航器或从父状态调用子状态方法

Call Navigator from outside state or call child state method from parent

我最终以父调用子方法结束,这很好,但我无法在状态外调用 Navigator class。我的目标是将子方法移动到它的状态并以某种方式访问​​它,或者在有状态小部件的状态之外调用 Navigator 表单。

解决这个问题的最佳方法是什么?

import 'package:flutter/material.dart';

class ParentClass extends StatefulWidget {
  const ParentClass({Key? key}) : super(key: key);

  @override
  _ParentClassState createState() => _ParentClassState();
}

class _ParentClassState extends State<ParentClass> {
  ChildClass childclass = ChildClass();
  @override
  Widget build(BuildContext context) {
    return Container(
      child: ElevatedButton(
          child: Text('Button'),
          onPressed: () => {
                childclass.callNavigator(),//or call callNavigatorState
              }),
    );
  }
}

class ChildClass extends StatefulWidget {
  const ChildClass({Key? key}) : super(key: key);
  void callNavigator() {
    //call navigator from here
  }
  @override
  _ChildClassState createState() => _ChildClassState();
}

class _ChildClassState extends State<ChildClass> {
  void callNavigatorState(){
    //access from parent widget?
  }
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

您可以使用 Globalkey.currentState...

访问有状态的状态

检查此示例代码:

class MyHomePage extends StatelessWidget {
  MyHomePage({Key? key}) : super(key: key);

  final child = ChildWidget(key: GlobalKey());
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          child,
          ElevatedButton(
              onPressed: () {
                (((child as ChildWidget).key as GlobalKey).currentState!
                        as _ChildWidgetState)
                    .someFunction();
              },
              child: Text("childWidget someFunction"))
        ],
      ),
    );
  }
}

class ChildWidget extends StatefulWidget {
  const ChildWidget({Key? key}) : super(key: key);

  @override
  _ChildWidgetState createState() => _ChildWidgetState();
}

class _ChildWidgetState extends State<ChildWidget> {
  void someFunction() {
    print("childWidget someFunction");
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}