/// * [DisplayFeatureSubScreen], which documents the specifics of how
/// [DisplayFeature]s can split the screen into sub-screens.
/// * [showDialog], which displays a Material-style dialog.
/// * [showCupertinoDialog], which displays an iOS-style dialog.
Future<T?> showGeneralDialog<T extends Object?>({
required BuildContext context,
required RoutePageBuilder pageBuilder,
bool barrierDismissible = false,
String? barrierLabel,
Color barrierColor = const Color(0x80000000),
Duration transitionDuration = const Duration(milliseconds: 200),
RouteTransitionsBuilder? transitionBuilder,
bool useRootNavigator = true,
RouteSettings? routeSettings,
Offset? anchorPoint,
}) {
assert(!barrierDismissible || barrierLabel != null);
return Navigator.of(context, rootNavigator: useRootNavigator).push<T>(RawDialogRoute<T>(
pageBuilder: pageBuilder,
barrierDismissible: barrierDismissible,
barrierLabel: barrierLabel,
barrierColor: barrierColor,
transitionDuration: transitionDuration,
transitionBuilder: transitionBuilder,
settings: routeSettings,
anchorPoint: anchorPoint,
));
}
實現(xiàn)很簡單,直接調(diào)用Navigator
的push
方法打開了一個新的對話框路由RawDialogRoute
泊窘,然后返回了push
的返回值熄驼∠窈可見對話框?qū)嶋H上正是通過路由的形式實現(xiàn)的,這也是為什么我們可以使用Navigator
的pop
方法來退出對話框的原因瓜贾。關(guān)于對話框的樣式定制在RawDialogRoute
中诺祸,沒有什么新的東西,讀者可以自行查看祭芦。這里我只取一部分
class RawDialogRoute<T> extends PopupRoute<T> {
/// A general dialog route which allows for customization of the dialog popup.
RawDialogRoute({
required RoutePageBuilder pageBuilder,
bool barrierDismissible = true,
Color? barrierColor = const Color(0x80000000),
String? barrierLabel,
Duration transitionDuration = const Duration(milliseconds: 200),
RouteTransitionsBuilder? transitionBuilder,
super.settings,
this.anchorPoint,
super.traversalEdgeBehavior,
}) : _pageBuilder = pageBuilder,
_barrierDismissible = barrierDismissible,
_barrierLabel = barrierLabel,
_barrierColor = barrierColor,
_transitionDuration = transitionDuration,
_transitionBuilder = transitionBuilder;
---....此處省略----
}