抽屉菜单和页面浏览之间的通信[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,但如果您不熟悉它,我刚才给您的方法应该可以解决问题
我想:当用户点击抽屉菜单项时,更改位于主屏幕的综合浏览量索引。
我试图从另一个文件更改索引,但我做不到
抽屉菜单代码
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,但如果您不熟悉它,我刚才给您的方法应该可以解决问题