0

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

我试图从 Page1 调用 Page2 的方法,但对我来说很难,因为它们都没有子/父关系,所以我不能使用回调函数。事实上,它们都是另一个父类(MainParent)的子类。我尝试使用 globalkey 但我收到 currentState is 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。

4

2 回答 2

0

PageView中,一次只有一页是mounted(或活动的)。

在这里,当您从 调用page2Key.currentState.refreshList();Page1Page2当前是unmounted(或停用)。所以状态本身是空的。

所以你不能做setState另一个页面。

于 2020-01-21T17:05:12.110 回答
0

您的代码中的错误是您在使用 Page2 实例时没有在 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();

您可以解决并使用另一种方法而不是静态键,但这应该是一个可行的解决方案。

于 2020-01-21T16:43:46.413 回答