自留查看
1. 使用 GlobalKey<ScaffoldState>
你可以通过 GlobalKey<ScaffoldState> 来控制 Scaffold 的状态,从而打开抽屉。这是 Flutter 推荐的一种方式,因为它能够跨越 widget 树来控制抽屉的行为。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
// 创建一个 GlobalKey 来控制 Scaffold
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey, // 将 GlobalKey 赋给 Scaffold
appBar: AppBar(
title: Text('Drawer Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 使用 GlobalKey 控制 Scaffold 打开抽屉
_scaffoldKey.currentState?.openDrawer();
},
child: Text('Open Drawer'),
),
),
drawer: Drawer(
child: ListView(
children: <Widget>[
DrawerHeader(child: Text('Drawer Header')),
ListTile(title: Text('Item 1')),
ListTile(title: Text('Item 2')),
],
),
),
);
}
}
解释:
GlobalKey<ScaffoldState> 用来获取 Scaffold 的状态。
通过 _scaffoldKey.currentState?.openDrawer() 打开抽屉。
2. 使用 Navigator + Scaffold
如果你希望在 Navigator 堆栈中的某个页面上打开抽屉,可以使用 Scaffold.of(context).openDrawer(),但是通过其他方法传递 BuildContext 来避免直接调用该方法。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Drawer Example')),
body: Center(
child: ElevatedButton(
onPressed: () {
// 使用 context 直接找到 Scaffold
Scaffold.of(context).openDrawer();
},
child: Text('Open Drawer'),
),
),
drawer: Drawer(
child: ListView(
children: <Widget>[
DrawerHeader(child: Text('Drawer Header')),
ListTile(title: Text('Item 1')),
ListTile(title: Text('Item 2')),
],
),
),
);
}
}
3. 使用 DrawerController
DrawerController 是一个可以直接控制抽屉打开和关闭的 widget,它允许你在不依赖 Scaffold.of(context) 的情况下控制抽屉。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DrawerController(
alignment: DrawerAlignment.start,
child: Scaffold(
appBar: AppBar(
title: Text('Drawer Controller Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 打开抽屉
Scaffold.of(context).openDrawer();
},
child: Text('Open Drawer'),
),
),
drawer: Drawer(
child: ListView(
children: <Widget>[
DrawerHeader(child: Text('Drawer Header')),
ListTile(title: Text('Item 1')),
ListTile(title: Text('Item 2')),
],
),
),
),
);
}
}
858

被折叠的 条评论
为什么被折叠?



