【问题标题】:How to call a function from another pageview class to another in Flutter?如何在 Flutter 中从另一个页面浏览类调用另一个函数?
【发布时间】:2020-05-07 15:44:38
【问题描述】:

我需要帮助在网页浏览中调用另一个类的方法。我有一个应用程序,它的页面浏览量由两个类组成,分别是 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。

【问题讨论】:

    标签: flutter dart inherited-widget


    【解决方案1】:

    您的代码中的错误是您在使用 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();
    

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

    【讨论】:

    • 对不起,如果我理解正确的话,这里命名参数中的currentStateKey不是staticGlobalKey?所以在我的主要父类中,我必须将唯一键传递给 page2?
    【解决方案2】:

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

    当您从Page1 呼叫page2Key.currentState.refreshList(); 时,Page2 当前为unmounted(或停用)。所以状态本身是空的。

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

    【讨论】:

    • 我明白了,谢谢!因此,如果我理解正确,我必须确保首先安装第 2 页,然后再从该类调用任何函数/静态变量。
    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2023-04-04
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多