如何在Flutter中从另一个浏览量类调用另一个函数?

时间:2020-01-21 14:41:15

标签: flutter dart inherited-widget

我需要在页面浏览量中调用另一个类的方法的帮助。我有一个应用程序,它的综合浏览量由两个类分别为Page 1和Page 2组成。它们都是有状态的小部件。

我试图从Page1的Page2中调用一个方法,但是这对我来说很困难,因为它们都不具有子/父关系,因此我无法使用回调函数。实际上,它们都是另一个父类(MainParent)的孩子。我尝试使用globalkey,但是收到currentState为null错误。

非常感谢您的帮助。谢谢!

class MainParent extends StatefulWidget{
   @override
   MainParentState createState() => MainParentSate();
}

class MainParentState extends State<MainParent> {

  PageController pageController;

  @override
  initState(){
    pageController = new PageController(
  }

  List<Widget> _showPageList(AppModel appModel){
     List<Widget> pageList = new List();
     pageList.add(Page1(/*some named parameters pass here*/));
     pageList.add(Page2(/*some named parameters pass here*/));
     return pageList;
  }

   @override
   Widget build(BuildContext context) {
     return Scaffold(
        body: PageView(
              physics: new NeverScrollableScrollPhysics(),
              controller: pageController,
              onPageChanged: _onPageChanged,
              children: _showPageList(),
        )
     );

   }
}

第1页的课程

class Page1 extends StatefulWidget{
   @override
   Page1State createState() => Page1State();
}

class Page1State extends State<Page1> {

  _callPage2Function(){
     //animate to page 2 and mount it
     MainParent.of(context).pageController.animateToPage(
      1,
      duration: const Duration(milliseconds: 700),
      curve: Curves.fastLinearToSlowEaseIn);

     //this doesn't work
     Page2State page2state = new Page2State();
     page2state.refreshList();

     //creating a global key doesnt work as well, gets currentstate is null
     GlobalKey<Page2State> page2Key = new GlobalKey<Page2State>();
     page2Key.currentState.refreshList();
  }

   @override
   Widget build(BuildContext context) {
     return Scaffold(
        body: Container(
           child: GestureDetector(
             onTap: () => _callPage2Function()
           )
        )
     );

   }
}

第2页课程

class Page2 extends StatefulWidget{
   @override
   Page2State createState() => Page2State();
}

class Page2State extends State<Page2> {

  refreshList(){
   //this function refreshes the list
  }

   @override
   Widget build(BuildContext context) {
     return Scaffold(
        body: Container(
           child: ListView.builder(
             //some child widgets here
           )
        )
     );

   }
}

编辑:编辑了我的代码。原来,我必须先导航到page2选项卡,因为当我位于第1页时,第2页未安装到屏幕上。因此,我添加了pageController并首先导航到page2。

2 个答案:

答案 0 :(得分:0)

您的代码中的错误是在使用键时没有将键注入到Page2实例中,这就是为什么currentState为null的原因。 通常,当我想实现这一目标时,我会像这样使用key属性

class Page2 extends StatefulWidget {
  static final GlobalKey<Page2State> staticGlobalKey =
      new GlobalKey<Page2State>();

  Page2() : super(key: Page2.currentStateKey); // Key injection
  @override
  Page2State createState() => Page2State();
}

class Page2State extends State<Page2> {
  refreshList() {

  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
            child: ListView.builder(
                //some child widgets here
                )));
  }
}

然后从您应用程序中的任何位置调用refreshList()即可

Page2.staticGlobalKey.currentState.refreshList();

您可以解决并使用其他方法代替静态密钥,但这应该是可行的解决方案。

答案 1 :(得分:0)

PageView中,一次只有一页mounted(或处于活动状态)。

在这里,当您从page2Key.currentState.refreshList();呼叫Page1时,Page2当前为unmounted(或无效)。因此状态本身为null。

因此您不能在另一页上setState