Flutterで単語アプリ作り19日目(Widgetを動的に生成する方法)

ダイアログ実装の続きをやる。

いろいろ調べてみると、AlertDialogとsimpleDialogという基本クラスがあって、自分が作ろうとしている部品はAlertDialogで作るのが適当らしいということを知る。

ていうか全然調べられてない!

他は、静的なwidgetの作成をlistViewを使わないでどうやって動的に実装するかを考えたりした。

例えば、こんな感じに静的に生成するAlertDialogのサンプルコードより

Future<void> _showMyDialog() async {
  return showDialog<void>(
    context: context,
    barrierDismissible: false, // user must tap button!
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text('AlertDialog Title'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              // ここを動的にしたい
              Text('This is a demo alert dialog.'),
              Text('Would you like to approve of this message?'),
            ],
          ),
        ),
        actions: <Widget>[
          TextButton(
            child: Text('Approve'),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      );
    },
  );
}

List<Widget>を関数で返せばいいじゃないかと思って、書いたらいけました。

    List<Widget> getWordMeanWidgets() {
      List<Widget> wordMeanWidgets = new List<Widget>();
      wordMeans.forEach((element) {
        // wordMeanWidgetはカスタムwidgetクラス
        // 本来はここをDBから取得して値を入れる
        wordMeanWidgets.add(wordMeanWidget(0, "name", 0));
      });
      return wordMeanWidgets;
    }
Future<void> _showMyDialog() async {
  return showDialog<void>(
    context: context,
    barrierDismissible: false, // user must tap button!
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text('AlertDialog Title'),
        content: SingleChildScrollView(
          child: ListBody(
            children: <Widget>[
              // 先の関数
         getWordMeanWidgets()
            ],
          ),
        ),
        actions: <Widget>[
          TextButton(
            child: Text('Approve'),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      );
    },
  );
}

とりあえず、これでいける。

いけてないのは、学ぶにつれて修正していけばいい!

コメントを残す

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