抽屉菜单和页面浏览之间的通信[flutter]

Comunication between drawer menu and pageview [flutter]

我想:当用户点击抽屉菜单项时,更改位于主屏幕的综合浏览量索引。

我试图从另一个文件更改索引,但我做不到

抽屉菜单代码

InkWell(
            onTap: () {
              debugPrint("Tapped");
              HomeApp().openMyGloves();
            },
)

openMyGloves()


class HomeApp extends StatefulWidget {
  const HomeApp({Key? key}) : super(key: key);

  @override
  State<HomeApp> createState() => _HomeAppState();

  void openMyGloves() {
    _HomeAppState()._openMyGloves();
  }
}

class _HomeAppState extends State<HomeApp> {

class _HomeAppState extends State<HomeApp> {
  int simdikiIndex = 1;
  late List<Widget> tumSayfalar;
  late Blog blogSayfa;
  late MyGloves gloveSayfa;
  late HomePage homeSayfa;
  late final controller;

  @override
  void initState() {
    blogSayfa = const Blog();
    gloveSayfa = const MyGloves();
    homeSayfa = const HomePage();
    tumSayfalar = [blogSayfa, homeSayfa, gloveSayfa];
    controller = PageController();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        drawer: const DrawerMenu(),
        bottomNavigationBar: bottomNav(),
        body: PageView(

            /// [PageView.scrollDirection] defaults to [Axis.horizontal].
            /// Use [Axis.vertical] to scroll vertically.
            controller: controller,
            children: <Widget>[blogSayfa, homeSayfa, gloveSayfa],
            onPageChanged: (page) {
              setState(() {
                simdikiIndex = page;
              });
            }));
  }

  BottomNavigationBar bottomNav() {
    return BottomNavigationBar(
      items: <BottomNavigationBarItem>[
        BottomNavigationBarItem(
          icon: Image.asset(
            "assets/images/info.png",
            scale: 2,
          ),
          label: "HAKKIMIZDA",
        ),
        BottomNavigationBarItem(
          icon: Image.asset(
            "assets/images/home.png",
            scale: 2,
          ),
          label: "ANA SAYFA",
        ),
        BottomNavigationBarItem(
          icon: Image.asset(
            "assets/images/gloves.png",
            scale: 2,
          ),
          label: "ELDİVENLERİM",
        ),
      ],
      onTap: (index) {
        setState(() {
          simdikiIndex = index;
          controller.jumpToPage(index);
        });
      },
      currentIndex: simdikiIndex,
    );
  }

  void _openMyGloves() {
    controller.jumpToPage(2);
  }
}
}

注意:我得到了

Late Initialization Error

for controller.for controller.for controller.for controller.for controller.for controller.for controller.for controller.for controller.for controller.for controller.for 控制器。

HomeApp().openMyGloves();

您在这里从 HomeApp 的一个新实例调用 openMyGloves(),它不是小部件树中存在的实例

要解决此问题,您必须访问构建在小部件树中的相同 HomeApp,这将通过以下步骤完成:

1- 通过删除下划线 _

使 _HomeAppState 不私有

2- 在 HomeApp 的父控件中使用 HomeAppState 定义全局键并将其传递给 HomeApp 控件

  static final GlobalKey<HomeAppState> homeAppKey = GlobalKey();

然后

child: HomeApp(key: homeAppKey),

现在您可以像这样使用此键调用 openMyGloves()

ParentWidget.homeAppKey.currentState?.openMyGloves();

ParentWidget 是 HomeApp 的父 class,您在其中定义密钥并将其传递给 HomeApp

如果您将要访问的页面视图值传递给父小部件,将会更容易,在您的 HomeApp() 示例中,代码应如下所示:

class DrawerMenu extends StatefulWidget {
  Function pageViewIndex;
  DrawerMenu({required this.pageViewIndex});
  @override
  _DrawerMenuState createState() => _DrawerMenuState();
}

class _DrawerMenuState extends State<DrawerMenu> {
  @override
  Widget build(BuildContext context) {
    return DrawerMenuItem(
      child: Text(item),
      onPressed: () {
        widget.pageViewIndex(x);
        // Where x equals the value you want to pass to HomeApp()
      }
    );
  }
}

完成后,您现在可以使用如下函数从 HomeApp() 读取该值:

// This function goes to HomeApp()
void function(pageViewIndex) {
  setState(() {
    simdikiIndex = pageViewIndex;
  });
}

一种不同的方法是使用 Provider,但如果您不熟悉它,我刚才给您的方法应该可以解决问题