我正在使用Scaffold小部件,但是在打开底部对话框时却遇到了异常
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Calendar"),
),
body: SafeArea(
.......
.......
child: GestureDetector(
onTap: (){
//getting exception here
showBottomSheet(
context: context,
builder: (context) => Container(
color: Colors.red,
));
},
我坚持使用此代码,如果有人可以提出任何建议,这将非常有帮助。谢谢。
答案 0 :(得分:15)
使用showModalBottomSheet
代替showBottomSheet
,例如下面。
void _settingModalBottomSheet(BuildContext context){
showModalBottomSheet(
context: context,
builder: (BuildContext bc){
return Container(
child: new Wrap(
children: <Widget>[
new ListTile(
leading: new Icon(Icons.music_note),
title: new Text('Music'),
onTap: () => {}
),
new ListTile(
leading: new Icon(Icons.videocam),
title: new Text('Video'),
onTap: () => {},
),
],
),
);
});
}
答案 1 :(得分:5)
问题在于用于显示context
的{{1}}不是BottomSheet
的{{1}}。您可以使用context
解决此问题,也可以将Scaffold
包裹在GlobalKey
小部件中,以便为您提供包含GestureDetector
引用的Builder
下面是一个使用context
状态为Scaffold
的示例:
GlobalKey
答案 2 :(得分:0)
我不是100%知道为什么这样做,但我猜测是因为它在支架之外。
class Example extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
),
body: SafeArea(child: YourWidget(),
)
);
}
}
class YourWidget extends StatelessWidget {
const YourWidget({
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: (){
//getting exception here
showBottomSheet(
context: context,
builder: (context) => Container(
color: Colors.red,
));
}
);
}
}
答案 3 :(得分:0)
使用 Builder 小部件包装小部件树
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Calendar"),
),
body: Builder( //HERE
builder:(context){
return SafeArea(
.......
.......
child: GestureDetector(
onTap: (){
//getting exception here
showBottomSheet(
context: context,
builder: (context) => Container(
color: Colors.red,
));
},