drawerEnableOpenDragGesture
设置为false.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
// this to prevent the default sliding behaviour
drawerEnableOpenDragGesture: false,
drawer: Drawer(),
appBar: AppBar(
leading: Builder(builder: (context) => // Ensure Scaffold is in context
IconButton(
icon: Icon(Icons.menu),
onPressed: () => Scaffold.of(context).openDrawer()
),
),
)
)
);
}
}
要使用Scaffold.of(context)
以编程方式打开抽屉,您必须确保(感谢Krolaw!)发出调用的上下文知道脚手架.
一个干净的方法是将按钮包装在生成器中.
scaffold是一个实现material 设计原则的小部件,因此请注意,要能够调用此方法,您需要使用import 'package:flutter/material.dart';
,并且您的小部件需要有一个MaterialApp作为祖先.
与许多Flutter 问题一样,还有其他解决方案可以确保脚手架处于上下文中.
错误消息是Flitter框架的最佳功能之一,请允许我谦虚地建议您始终彻底阅读它们,并探索它们指向的文档.
例如,如果在适当的上下文之外调用openDrawer,就会收到错误消息的一部分:
Scaffold.of() called with a context that does not contain a Scaffold.个
从传递给Scaffold.of()的上下文开始,找不到任何Scaffold祖先.当提供的上下文来自与其构建函数实际创建所查找的Scaffold小部件相同的StatefulWidget时,通常会发生这种情况.
有几种方法可以避免此问题.最简单的方法是使用Builder来获取"在"Scaffold下的上下文.有关这方面的示例,请参阅Scaffold.of()的文档: https://api.flutter.dev/flutter/material/Scaffold/of.html个
更有效的解决方案是将构建函数拆分为几个小部件.这将引入一个新的上下文,您可以从中获取Scaffold.在此解决方案中,您将有一个外部小部件来创建由新内部小部件的实例填充的Scaffold,然后在这些内部小部件中使用Scaffold.of().
一种不那么优雅但更方便的解决方案是将GlobalKey分配给Scaffold,然后使用key.currentState属性而不是使用Scaffold.of()函数来获取ScaffoldState.