原因:
在 Flutter 中,Scaffold.of(context)
會沿著當前的 context
向上查找最近的 Scaffold
。如果當前的 widget 樹層級中沒有合適的 Scaffold
(比如按鈕所在的 context 是在某個子 widget 中),就找不到它。
解決辦法:
1.你可以使用 Builder
來創建一個新的 context
,這個新的 context 是屬于 Scaffold
的子樹,這樣就能正確找到 Scaffold
。
class RightDrawerExample extends StatelessWidget {Widget build(BuildContext context) {return Scaffold(endDrawer: Drawer(child: ListView(padding: EdgeInsets.zero,children: [DrawerHeader(decoration: BoxDecoration(color: Colors.blue,),child: Text('右側抽屜'),),ListTile(title: Text('選項 1'),onTap: () {Navigator.pop(context); // 關閉抽屜},),ListTile(title: Text('選項 2'),onTap: () {Navigator.pop(context); // 關閉抽屜},),],),),body: Center(child: Builder(builder: (context) => ElevatedButton(onPressed: () {Scaffold.of(context).openEndDrawer();},child: Text('打開右側抽屜'),),),),);}
}
2.也可以通過 GlobalKey 來訪問 Scaffold
class RightDrawerExample extends StatefulWidget { _RightDrawerExampleState createState() => _RightDrawerExampleState();
}class _RightDrawerExampleState extends State<RightDrawerExample> {final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();Widget build(BuildContext context) {return Scaffold(key: _scaffoldKey, // 設置 keyendDrawer: Drawer(child: Center(child: Text('這是一個從右側滑出的抽屜')),),body: Center(child: ElevatedButton(onPressed: () {_scaffoldKey.currentState?.openEndDrawer(); // 使用 key 打開抽屜},child: Text('打開右側抽屜'),),),);}
}