Как вызвать функцию из другого класса просмотра страниц в другой в Flutter? - PullRequest
0 голосов
/ 21 января 2020

Мне нужна помощь в вызове метода другого класса в просмотре страницы. У меня есть приложение, которое имеет просмотр страницы, состоящий из двух классов, Страница 1 и Страница 2 соответственно. Оба они являются виджетами с состоянием.

Я пытаюсь вызвать метод из Page2 из Page1, но это трудно для меня, так как у них обоих нет отношений ребенок / родитель, поэтому я не мог использовать функцию обратного вызова. На самом деле они оба являются потомками другого родительского класса (MainParent). Я пытался использовать globalkey, но я получил currentState - нулевая ошибка.

Ваша помощь очень ценится. Спасибо!

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 и сначала перешел на страницу 2.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

В PageView, только одна страница является mounted (или активной) одновременно.

Здесь, когда вы звоните page2Key.currentState.refreshList(); из Page1, Page2 в настоящее время unmounted (или деактивированный). Таким образом, само состояние является нулевым.

Так что вы не можете сделать setState другой страницы.

0 голосов
/ 21 января 2020

Ошибка в вашем коде заключается в том, что вы не вводите ключ в свой экземпляр Page2 при его использовании, поэтому currentState имеет значение null. Обычно, когда я хочу достичь этого, я использую атрибут ключа следующим образом:

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();

Вы можете работать и использовать другой подход вместо stati c key, но это должно быть рабочим решением.

...