flutter 当单击AlertDialog之外的任何地方时,如何同时关闭AlertDialog和DropDownButton

brc7rcf0  于 2023-08-07  发布在  Flutter
关注(0)|答案(1)|浏览(194)

我创建了一个Flutter Web应用程序。我的屏幕有AlertDialog,在对话框中有一个DropDownButton Widget。我的要求是,当我打开AlertDialog并点击DropDownButton时,如果我单击AlertDialog之外的任何位置,对话框和DropDownButton应该同时关闭。
请帮助我,如果有任何解决方案。

tpgth1q7

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之外的点击并将其关闭。

相关问题