具有灵活高度和可滚动内容的对话框

Seb*_*ien 3 dialog dart flutter flutter-layout

我正在尝试创建一个自定义对话框,该对话框将与其内容一样短,直到该内容太高为止,此时它应该是可滚动的。

这就是我要开始的内容:

showDialog(
  context: context,
  useSafeArea: true,
  barrierDismissible: true,
  useRootNavigator: false,
  builder: (context) => Dialog(
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(20),
    ),
    elevation: 3,
    backgroundColor: Theme.of(context).colorScheme.surface,
    child: Padding(
      padding: const EdgeInsets.all(20.0),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          Text(lorem(paragraphs: 1)),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              Navigator.pop(context);
            },
            child: Text('OK'),
          ),
        ],
      ),
    ),
  ),
);
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:

在此输入图像描述

现在,如果我添加更多文本以使其更高,对话框的高度就会调整:

在此输入图像描述

如果我们更进一步,在某个时候,我们就会陷入溢出:

在此输入图像描述

因此,我将文本包装在 SingleChildScrollView 中,但这不足以修复溢出,因此我将 SingleChildScrollView 包装在 Expanded 中:

Column(
    mainAxisSize: MainAxisSize.min,
    crossAxisAlignment: CrossAxisAlignment.stretch,
    children: [
      Expanded(
        child: SingleChildScrollView(
          child: Text(lorem(paragraphs: 30)),
        ),
      ),
      SizedBox(height: 20),
      ElevatedButton(
        onPressed: () {
          Navigator.pop(context);
        },
        child: Text('OK'),
      ),
    ],
)
Run Code Online (Sandbox Code Playgroud)

这次,文本按预期滚动,并且对话框使用了它可以使用的所有垂直空间,但不能使用更多空间:

在此输入图像描述

但现在,如果我再次减小文本大小,使其短于可用空间,则对话框仍然占据所有垂直空间,并在文本和按钮之间留下间隙:

在此输入图像描述

显然,这不是我想要的。知道如何在不调用 MediaQuery 巫术的情况下完成这项工作吗?

Mar*_*del 7

您可以使用“列”和“灵活”。

void showCustomDialog(BuildContext context, String message) async {
    await showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          content: Container(
            width: double.maxFinite,
            child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                mainAxisSize: MainAxisSize.min,
                children: [                      
                  Text("Description 1",
                      style: TextStyle(fontWeight: FontWeight.bold)),
                  SizedBox(height: 8),
                  Flexible(
                    child: SingleChildScrollView(
                      child: Text(message),
                    ),
                  ),
                  ElevatedButton(
                    onPressed: () {
                       Navigator.of(context).pop();
                    },
                    child: Text("OK"),
                  )
                ]),
          ),
        );
      },
    );
  }
Run Code Online (Sandbox Code Playgroud)