LoginSignup
6
2

More than 1 year has passed since last update.

flutterでAlertDialogをListViewで表示使用しようとしたら、エラーが発生した(RenderViewport does not support returning intrinsic dimensions.)

Last updated at Posted at 2021-06-10

AlertDialogをListViewで表示させたい

タイトルにもありますが、AlertDialogの表示をListViewで表示しようとしたら、エラーが発生しエラーログを検索した所、英語の記事が多かったので自分の復習と少しでも誰かの役に立てればと思い、投稿します。

まずは、エラーが発生したコード

main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'DialogPractice',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DialogPractice'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('ダイアログ表示ボタン'),
          onPressed: () {
            showDialog(
              context: context,
              builder: (_) {
                return AlertDialog(
                  // AlertDialogのcontentプロパティにListViewを渡す
                  content: ListView(
                    children: [
                      ListTile(
                        leading: Icon(Icons.map),
                        title: Text('Map'),
                        trailing: Text('>'),
                        onTap: () {
                          // タップした時の処理を記入
                        },
                      ),
                      ListTile(
                        leading: Icon(Icons.photo_album),
                        title: Text('Album'),
                        trailing: Text('>'),
                        onTap: () {
                          // タップした時の処理を記入
                        },
                      ),
                      ListTile(
                        leading: Icon(Icons.phone),
                        title: Text('Phone'),
                        trailing: Text('>'),
                        onTap: () {
                          // タップした時の処理を記入
                        },
                      ),
                    ],
                  ),
                );
              },
            );
          },
        ),
      ), //
    );
  }
}

コード実行後のエラー内容(画像)
最初のエラーコード(Render,,,)部分を検索して、英語記事を参考にして解決しました。
スクリーンショット 2021-06-10 23.33.46.png

解決方法

下記コード、追記部分のListViewをContainerでラップして、width: double.maxFiniteで指定した所、うまく表示出来ました。
widthで指定しているdouble.maxFiniteですが、double型の有限値を示すものらしく、有限値内のサイズで指定出来るようです。(正確にはわかりきれていません。。。)
※widthの指定は、任意の値でも問題なく動作します。
maxFiniteドキュメント

main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'DialogPractice',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DialogPractice'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('ダイアログ表示ボタン'),
          onPressed: () {
            showDialog(
              context: context,
              builder: (_) {
                return AlertDialog(
                  title: Text('ダイアログサンプル'),
                  // 追記 ContainerでListViewをラップして、width(横サイズ)を指定した
                  content: Container(
                    width: double.maxFinite,
                    child: ListView(
                      children: [
                        ListTile(
                          leading: Icon(Icons.map),
                          title: Text('Map'),
                          trailing: Text('>'),
                          onTap: () {},
                        ),
                        ListTile(
                          leading: Icon(Icons.photo_album),
                          title: Text('Album'),
                          trailing: Text('>'),
                          onTap: () {},
                        ),
                        ListTile(
                          leading: Icon(Icons.phone),
                          title: Text('Phone'),
                          trailing: Text('>'),
                          onTap: () {},
                        ),
                      ],
                    ),
                  ),
                );
              },
            );
          },
        ),
      ), //
    );
  }
}

スクリーンショット 2021-06-11 1.10.48.png

エラー解決ができたので、良かったです。
ですが、少し味気なかったので、アレンジしてみました。

main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'DialogPractice',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DialogPractice'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('ダイアログ表示ボタン'),
          onPressed: () {
            showDialog(
              context: context,
              builder: (_) {
                return AlertDialog(
                  title: Text('ダイアログサンプル'),
                  // デフォルトで全方向にpaddingが付いているので、paddingを外す。
                  contentPadding: EdgeInsets.zero,
                  // 背景色を青色の半透明に変更。
                  backgroundColor: Colors.blue.withOpacity(0.6),
                  content: Container(
                    width: double.maxFinite,
                    // 今回は、要素が3しかない設定で余白が余っていたので、heightを指定
                    height: 200,
                    child: ListView(
                      children: [
                        ListTile(
                          leading: Icon(Icons.map),
                          title: Text('Map'),
                          trailing: Text('>'),
                          onTap: () {
                            // タップした時の処理を記入する
                          },
                        ),
                        ListTile(
                          leading: Icon(Icons.photo_album),
                          title: Text('Album'),
                          trailing: Text('>'),
                          onTap: () {
                            // タップした時の処理を記入する
                          },
                        ),
                        ListTile(
                          leading: Icon(Icons.phone),
                          title: Text('Phone'),
                          trailing: Text('>'),
                          onTap: () {
                            // タップした時の処理を記入する
                          },
                        ),
                      ],
                    ),
                  ),
                );
              },
            );
          },
        ),
      ), 
    );
  }
}

スクリーンショット 2021-06-11 2.09.50.png

以上となります。
少しでも誰かの参考になれば、幸いです。
もし、投稿内容に不備やおかしい所があれば、是非コメントの方を宜しくお願い致します。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2