一般出现这种问题都是直接在 MaterialApp 层显示 Dialog 造成的,因为显示 Dialog 传入的是 MaterialApp 层的 context,所以会出现这种错误。
错误代码如下所示:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Demo'),
),
body: Center(
child: RaisedButton(
onPressed: () {
showCupertinoDialog(
///此处传入的是 MaterialApp 的 context
context: context,
builder: (context) {
/// 此处省略弹窗代码
}
}
},
child: Text('点击显示弹窗'),
),
),
),
);
}
}
因为 context 是 MaterialApp 的,所以会报这样的错:
════════ Exception caught by gesture ════════ The following NoSuchMethodError was thrown while handling a gesture: The getter 'modalBarrierDismissLabel' was called on null. Receiver: null Tried calling: modalBarrierDismissLabel
解决方案如下:
直接在 MaterialApp 的 home 中在传入一个继承于 StatelessWidget 或者是 StatefulWidget 的部件即可。如:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DialogPage(),
);
}
}
class DialogPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Demo'),
),
body: Center(
child: RaisedButton(
onPressed: () {
_showDialog(context);
},
child: Text('点击显示弹窗'),
),
),
);
}
}
void _showDialog(widgetContext) {
showCupertinoDialog(
context: widgetContext,
builder: (context) {
return CupertinoAlertDialog(
title: Text('确认删除'),
actions: [
CupertinoDialogAction(
child: Text('确认'),
onPressed: () {
Navigator.of(context).pop();
},
),
CupertinoDialogAction(
child: Text('取消'),
isDestructiveAction: true,
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}