【Flutter】FutureBuilder × ListView


少しハマった箇所があったので、備忘録として記録します。

目次

やりたいこと

  1. プログレス(グルグル回るやつ)を表示する
  2. ストレージにアクセスし、表示データのリストを取得
  3. プログレスの代わりに、取得したデータのListViewを表示する

ハマったこと

ListViewの要素が増えると、bottomがオーバーフローする。スクロールもできない。

以下がその実装

class PasswordListPage extends StatefulWidget {
  // ......
}

class _PasswordListPageState extends State<PasswordListPage> {
  Future<List<PasswordInfo>> _passwords = PasswordService().findAll(); // 内部でストレージにアクセス

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // ......
      body: Column(
          // ......
          PasswordWidget.futureListView(passwords: _passwords),
        ],
      ),
    );
  }
}
class PasswordWidget {
  /// パスワード情報取得後、パスワード一覧を表示するWidgetを返却
  static Widget futureListView({required Future<List<PasswordInfo>> passwords}) {
    return FutureBuilder<List<PasswordInfo>>(
        future: passwords,
        builder: (_, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
              // ......
            );
          } else {
            return const Center(
              child: CircularProgressIndicator(),
            );
          }
        },
    );
  }
}

原因・修正内容

親のColumn内で FutureBuilder のサイズが指定されていなかったことが原因の様子。

親子関係を Column – FutureBuilder から Column – FlexibleFutureBuilder へ変更することで、ListViewのスクロールが可能になり、オーバーフローすることはなくなった。

class PasswordListPage extends StatefulWidget {
  // ......
}

class _PasswordListPageState extends State<PasswordListPage> {
  Future<List<PasswordInfo>> _passwords = PasswordService().findAll(); // 内部でストレージにアクセス

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // ......
      body: Column(
          // ......
          Flexible(
            child: PasswordWidget.futureListView(passwords: _passwords),
          ),
        ],
      ),
    );
  }
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です