Flutter использует PageController для изменения PageView из другого класса

Справка Я новичок в флаттере, и я создал файл с функциями OnTap TapGestureRecognizer, которым я пытаюсь управлять pageView на второй странице. Я пробовал несколько разных вариантов, но не могу понять, как заставить pageController изменить вид страницы на второй странице.

Корневой класс

class RootApp extends StatefulWidget {
  @override
  RootAppState createState() => RootAppState();
}

class RootAppState extends State<RootApp> {
  bool isFavorite = false;
  int pageIndex = 0;

  PageController _pgController = PageController();

  void pgCont(pg){
     _pgController.animateToPage(pg, duration: Duration(milliseconds: 250), curve: Curves.bounceInOut);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView(controller: _pgController,
        children: <Widget>[
        getBody1() ,
        getBody2(),
      ]),
      bottomNavigationBar: getFooter(),
    );
  }

Заголовок Домашний класс

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

   RootAppState rooting = RootAppState();
 }

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text.rich(
          TextSpan(
            text: "Body1",
          recognizer: TapGestureRecognizer()
        ..onTap = (){
              print('He Clicked Body1');
              rooting.pgCont(1);
        },
   SizedBox(
      width: 8,
    ),
    Text.rich(
      TextSpan(
      text: "Body2",
      recognizer: TapGestureRecognizer()
          ..onTap = (){
        print('She clicked Body2');
        rooting.pgCont(2);
          },),
      style: TextStyle(
          color: white, fontSize: 17, fontWeight: FontWeight.w500),
    )
  ],
);

Пожалуйста, помогите, я застрял на чем-то, что кажется таким простым, что я упускаю или делаю неправильно здесь?


person ukholly    schedule 15.06.2021    source источник
comment
- Во-первых, неразумно вызывать состояние другого виджета из другого виджета. - Пожалуйста, опишите ожидаемый результат и фактический результат в отдельных пунктах. - Некоторые фрагменты вашего кода отсутствуют!   -  person p2kr    schedule 15.06.2021
comment
- в основном, я пытаюсь изменить вид страницы с body1 на body2, когда щелкается связанный текст, например. Пользователь нажимает Body 1, и вид страницы меняется на Body 1. спасибо   -  person ukholly    schedule 15.06.2021
comment
использовать свойство page PageController (с setState)   -  person p2kr    schedule 15.06.2021
comment
извините, я новичок и застрял! не могли бы вы показать мне, как бы вы реализовали мой фрагмент кода, пожалуйста   -  person ukholly    schedule 15.06.2021


Ответы (1)


В RootAppState классе

  void pgCont(pg){
    if(_pgController.hasClients) {
     _pgController.animateToPage(pg, duration: Duration(milliseconds: 250), curve: Curves.bounceInOut);
    }
  }

В HeaderHome классе

onTap = (){
        print('She clicked Body2');
        rooting.pgCont(0); // index starts from 0
    },

Неразумно вызывать состояние другого виджета из другого виджета. Вы должны использовать обратный вызов для работы с кодом из другого класса State.

https://www.geeksforgeeks.org/flutter-working-with-callback-functions/

person p2kr    schedule 16.06.2021