📅  最后修改于: 2023-12-03 15:36:37.730000             🧑  作者: Mango
在 Flutter 开发中,我们可能需要在 widget 树的某处调用 Scaffold.of()
获取当前 Scaffold
实例的上下文,以便对 Scaffold
进行一些操作,比如弹出 SnackBar
或者 BottomSheet
。
如果我们在使用 Scaffold
的时候直接在 build
方法里面创建,那么 Scaffold
会自动关联到当前的 BuildContext
上下文中,我们可以直接调用 Scaffold.of(context)
来获取当前 Scaffold
实例的上下文。例如:
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My Home Page'),
),
body: Builder(
builder: (context) => Center(
child: ElevatedButton(
child: Text('Show SnackBar'),
onPressed: () {
final snackBar = SnackBar(
content: Text('SnackBar'),
duration: Duration(seconds: 1),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
},
),
),
),
);
}
}
但是,有时我们需要在 build
方法之外的其他地方调用 Scaffold.of()
来获取当前 Scaffold
实例的上下文,这时就需要添加一个 Builder
来手动创建 BuildContext
上下文。例如:
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: Text('My Home Page'),
),
body: Center(
child: ElevatedButton(
child: Text('Show SnackBar'),
onPressed: () {
_showSnackBar();
},
),
),
);
}
void _showSnackBar() {
final snackBar = SnackBar(
content: Text('SnackBar'),
duration: Duration(seconds: 1),
);
_scaffoldKey.currentState.showSnackBar(snackBar);
}
}
在这个例子中,我们使用了 GlobalKey
来获取 ScaffoldState
实例,并在 _showSnackBar()
方法中调用 showSnackBar()
方法来弹出 SnackBar
,这种方式同样可以在其他场景下使用。
总之,无论是直接在 build
方法中创建 Scaffold
,还是手动创建 BuildContext
上下文来调用 Scaffold.of()
,我们都可以方便地对 Scaffold
进行操作,实现很多有趣的交互效果。