【Flutter】選択ダイアログでエラーが出るときはSimpleDialogを使おう

31624 ワード

選択ダイアログを表示するとエラーが出てしまう

次のような都道府県を選択するダイアログを例にとって説明します。

サンプル

選択ダイアログを作るとき、AlertDialog 内で ListView.builder() を使うとエラーが出てしまいます。

エラーが出る
final selectorDialog = AlertDialog(
  content: ListView.builder(
    itemCount: _prefectures.length,
    itemBuilder: (context, index) {
      final p = _prefectures[index];
      return ListTile(
        title: Text(p),
        onTap: () {
          Navigator.of(context).pop(p);
        },
      );
    },
  ),
);
エラーの内容
The following assertion was thrown during performLayout():
RenderViewport does not support returning intrinsic dimensions.

Calculating the intrinsic dimensions would require instantiating every child of the viewport, which defeats the point of viewports being lazy.

If you are merely trying to shrink-wrap the viewport in the main axis direction, consider a RenderShrinkWrappingViewport render object (ShrinkWrappingViewport widget), which achieves that effect without implementing the intrinsic dimension API.

結論

SimpleDialog を使うとうまくいきます。

SimpleDialog だとうまくいく
final selectorDialog = SimpleDialog(
  children: _prefectures
      .map(
        (p) => ListTile(
          title: Text(p),
          onTap: () {
            Navigator.of(context).pop(p);
          },
        ),
      )
      .toList(),
);

どうしても AlertDialog を使いたい場合は、SingleChildScrollViewColumn を組み合わせればうまくいきます。

AlertDialog でもうまくいく
final selectorDialog = AlertDialog(
  content: SingleChildScrollView(
    child: Column(
      children: _prefectures
          .map(
            (p) => ListTile(
              title: Text(p),
              onTap: () {
                Navigator.of(context).pop(p);
              },
            ),
          )
          .toList(),
    ),
  ),
);

サンプルコード全体