我创建了一个Flutter Web应用程序。我的屏幕有AlertDialog,在对话框中有一个DropDownButton Widget。我的要求是,当我打开AlertDialog并点击DropDownButton时,如果我单击AlertDialog之外的任何位置,对话框和DropDownButton应该同时关闭。请帮助我,如果有任何解决方案。
tpgth1q71#
要实现Flutter Web应用程序中描述的行为,可以将PopupMenuButton小部件与覆盖结合使用。覆盖将捕获AlertDialog之外的点击,并将其与DropDownButton沿着关闭。以下是如何实现此功能的分步指南:导入所需的包:确保您有flutter和flutter/material.dart包导入您的Dart文件。使用StatefulWidget:由于您希望在显示或关闭AlertDialog时处理状态更改,因此对主小部件使用StatefulWidget。创建一个函数来显示AlertDialog:在StatefulWidget的状态下,创建一个函数以在需要时显示AlertDialog。您可以使用showMenu函数显示PopupMenuButton。创建覆盖:使用包裹在堆栈中的GestureDetector创建覆盖整个屏幕的覆盖层,并捕获AlertDialog外部的点击。下面是一个示例代码片段来演示实现:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { GlobalKey _key = GlobalKey(); // Function to show the AlertDialog (DropDownButton in this case) void _showDropDownMenu() { final RenderBox renderBox = _key.currentContext.findRenderObject() as RenderBox; final position = renderBox.localToGlobal(Offset.zero); showMenu( context: context, position: RelativeRect.fromLTRB( position.dx, position.dy, position.dx + renderBox.size.width, position.dy + renderBox.size.height, ), items: [ PopupMenuItem( child: Text('Option 1'), value: 1, ), PopupMenuItem( child: Text('Option 2'), value: 2, ), // Add more options if needed ], elevation: 8.0, ).then((selectedValue) { // Handle the selected value here if needed if (selectedValue != null) { print('Selected value: $selectedValue'); } }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Flutter Web Dialog Example')), body: Center( child: ElevatedButton( key: _key, onPressed: () { // Call the function to show the AlertDialog _showDropDownMenu(); }, child: Text('Open Dialog'), ), ), ); } }
字符串在本例中,点击AlertDialog外部将关闭AlertDialog和DropDownButton。当你点击“打开对话框”按钮时,它会打开屏幕顶部的DropDownButton(PopupMenuButton),后台的GestureDetector会捕捉DropDownButton之外的点击并将其关闭。
1条答案
按热度按时间tpgth1q71#
要实现Flutter Web应用程序中描述的行为,可以将PopupMenuButton小部件与覆盖结合使用。覆盖将捕获AlertDialog之外的点击,并将其与DropDownButton沿着关闭。以下是如何实现此功能的分步指南:
导入所需的包:确保您有flutter和flutter/material.dart包导入您的Dart文件。
使用StatefulWidget:由于您希望在显示或关闭AlertDialog时处理状态更改,因此对主小部件使用StatefulWidget。
创建一个函数来显示AlertDialog:在StatefulWidget的状态下,创建一个函数以在需要时显示AlertDialog。您可以使用showMenu函数显示PopupMenuButton。
创建覆盖:使用包裹在堆栈中的GestureDetector创建覆盖整个屏幕的覆盖层,并捕获AlertDialog外部的点击。
下面是一个示例代码片段来演示实现:
字符串
在本例中,点击AlertDialog外部将关闭AlertDialog和DropDownButton。当你点击“打开对话框”按钮时,它会打开屏幕顶部的DropDownButton(PopupMenuButton),后台的GestureDetector会捕捉DropDownButton之外的点击并将其关闭。