[英]Flutter: How to call openDrawer from other widget
Question: I want to call openDrawer from onPressed() of Header.dart问:我想从 Header.dart 的 onPressed() 调用 openDrawer
The Drawer.dart, Header.dart and Home.dart files are separate.抽屉.dart、Header.dart和Home.ZBB14127678960FAE157D873950EA文件是分开的。
I have tried Scaffold.of(context).openDrawer();
我试过
Scaffold.of(context).openDrawer();
not worked.没用。
I tried using cotroller
but it not work.我尝试使用
cotroller
但它不起作用。 Perhaps it was not used in the right way.也许它没有以正确的方式使用。
I would appreciate any advice you could give me.我会很感激你能给我的任何建议。
code:代码:
Codes are omitted.代码被省略。
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: Header('App'),
endDrawer: Menu(),
)}}
class Header extends StatefulWidget implements PreferredSizeWidget {
const Header(this.heading, {Key? key});
final String heading;
@override
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
@override
State<Header> createState() => _HeaderState(heading);
}
class _HeaderState extends State<Header> {
_HeaderState(this.heading);
final String heading;
@override
Widget build(BuildContext context) {
return AppBar(
centerTitle: false,
actions: <Widget>[
IconButton(
icon: const Icon(Icons.menu, size: 30.0),
tooltip: '',
onPressed: () {
// _key.currentState!.openDrawer();
},
),]
);
}
}
class Menu extends StatelessWidget {
const Menu({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Drawer()
}
You're using an end drawer, so instead of Scaffold.of(context).openDrawer()
, you should use Scaffold.of(context).openEndDrawer()
:您使用的是末端抽屉,因此您应该使用
Scaffold.of(context).openEndDrawer()
而不是Scaffold.of(context).openDrawer()
(context).openDrawer() :
class _HeaderState extends State<Header> {
_HeaderState(this.heading);
final String heading;
@override
Widget build(BuildContext context) {
return AppBar(
centerTitle: false,
actions: <Widget>[
IconButton(
icon: const Icon(Icons.menu, size: 30.0),
tooltip: '',
onPressed: () {
Scaffold.of(context).openEndDrawer();
},
),]
);
}
}
Side Note : You don't need to pass arguments from the StatefulWidget
to the State
- Every instance of State
has a widget
property, which you can use to access the properties of the parent widget.旁注:您不需要将arguments从
StatefulWidget
传递到State
- State
的每个实例都有一个widget
属性,您可以使用它来访问小部件的父属性。
In your case it would look like:在您的情况下,它看起来像:
class Header extends StatefulWidget implements PreferredSizeWidget {
const Header(this.heading, {Key? key});
final String heading;
@override
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
@override
State<Header> createState() => _HeaderState();
}
class _HeaderState extends State<Header> {
@override
Widget build(BuildContext context) {
return AppBar(
centerTitle: false,
// Assuming this is what the heading argument is for
title: Text(widget.heading),
actions: <Widget>[
IconButton(
icon: const Icon(Icons.menu, size: 30.0),
tooltip: '',
onPressed: () {
Scaffold.of(context).openEndDrawer();
},
),
],
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.