Chapter 05

Flutterスマホアプリ・MultiPart以外(ファイル項目、画像項目がない)の例-2/4

kazpgm
kazpgm
2022.06.14に更新

■商品情報一覧画面 shohin_list.dart

flutter_app\lib\affairs\shohin\shohin_list.dart

shohin_list.dart
/// 商品情報一覧画面
class ShohinList extends StatefulWidget {
  final String title;

username:ログインユーザー名
cookies:HTTPで取得したcookies
headers:HTTPで取得したheaders
resData:HTTPで取得したresData

  final String username;
  final Map<String, String> cookies;
  final Map<String, String> headers;
  final String resData;

  const ShohinList({Key? key, required this.title, required this.username,
          required this.headers, required this.cookies, required this.resData}) : super(key: key);
  
  State<ShohinList> createState() => _ShohinListState();
}

class _ShohinListState extends State<ShohinList> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  String _errorSuccessMsg = "";
  late ShohinSrchForm _shohinSrchForm;

商品名の入力項目(TextFormField)は、入力値表示のためTextEditingControllerが必要。

  final TextEditingController _productsController = TextEditingController();
  final TextEditingController _productsnameController = TextEditingController();

_scrollController:画面を先頭に戻す(エラー・成功メッセージ行)ため使用する。

  late ScrollController _scrollController;

_selectItems:検索項目のリスト。昇順降順に使用している。
_selectItemNames :検索項目日本語名のリスト

  final List<String> _selectItems = ["products", "productsname", "biztypeCd", "categoryCd", "subcategoryCd", "extracategoryCd", "openkbn1", "insdt", "updt"];
  final List<String> _selectItemNames = ["商品CD", "商品名", "業種ID", "大分類", "中分類", "小分類", "公開区分", "登録日時", "更新日時"];
  int _selectItem = 0;

検索タブ、リストタブの切替INDEX

  int _selectedIndex = 0;

  
  Widget build(BuildContext context) {
    initializeDateFormatting("ja_JP");
    return Scaffold(
      appBar: AppBar(


        title: Text('商品情報一覧' + (_selectedIndex == 0?"\n検索タブ":"\nリストタブ"),
            overflow: TextOverflow.clip,
            style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold)),
        centerTitle:true,
        backgroundColor: Colors.green,
        // ログアウト
        actions: <Widget>[
          IconButton(
            onPressed: () async {

ログアウトはCommUtils.onSignOutCommメソッドを使用する。

              String? _msg = await CommUtils.onSignOutComm(
                  context, _scrollController,
                  widget.headers, widget.cookies);
              if (_msg != "") {
                setState(() {
                  _errorSuccessMsg = _msg;
                });
              }
            },
            icon: const Icon(Icons.exit_to_app),
          ),
        ],
      ),
      // 画面に収まりきれないので、ListViewを使う
      body: Form(
        key: _formKey,
        child : ListView(

controller: _scrollControllerとし、画面を先頭に戻す(エラー・成功メッセージ行)ため使用する。

          controller: _scrollController,

bodyはListViewとし、children:_makeWidgetsメソッドとする。
_makeWidgetsメソッドは List<Widget> を戻している。

          children: _makeWidgets(),
       ),
      ),

ナビゲーションバーの検索タブ、リストタブ

      bottomNavigationBar: BottomNavigationBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.search),
            label:'検索タブ',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.list),
            label:'リストタブ',
          ),
        ],
        currentIndex: _selectedIndex,
        onTap: _onItemTapped,
      ),
     );
  }

ナビゲーションバーの検索タブ、リストタブをタップしたときの処理

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

body表示用_makeWidgetsメソッドは検索タブのときは_makeCndsWidgetsメソッド、リストタブのときはmakeListWidgetsメソッドを行う。

  List<Widget> _makeWidgets() {
      if (_selectedIndex == 0) {
        return _makeCndsWidgets();
      } else {
        return _makeListWidgets();
      }
  }

_makeCndsWidgetsメソッドは検索タブ。

  List<Widget> _makeCndsWidgets() {
    var contentWidgets = List<Widget>.empty(growable: true);
    //var contentWidgets = <Widget>[];
    if (_errorSuccessMsg.isNotEmpty) {
      contentWidgets.add(

        // エラーメッセージ
          Container(
            padding: const EdgeInsets.fromLTRB(20.0, 10, 20.0, 5.0),
            child:Text(_errorSuccessMsg,
              textAlign: TextAlign.center,
              overflow: TextOverflow.clip,
              style: const TextStyle(fontWeight: FontWeight.bold, color: Colors.red),),
          )
      );
    } else {

      contentWidgets.add(const SizedBox(
        height : 10.0,
      ));
    }
    contentWidgets.add(
      // 商品CD
      Container(
        margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
        padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
        decoration: CommUtils.commBoxDecoration(),
        child:Column(

          children:<Widget>[TextFormField(
              controller: _productsController,
              decoration: const InputDecoration(
                labelText: "商品CD",
                hintText: 'シーケンス(A+yymmdd+数字)完全一致',
              ),
            ),

HTTPでサーバーから戻ってきた項目エラーを表示する。正常時は高さ0になるので表示されない。

            Text(
              // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
              _shohinSrchForm.shohinSrchErrForm.productsErr.join("\n"),
              textAlign: TextAlign.left,
              overflow: TextOverflow.clip,
              style: TextStyle(height:_shohinSrchForm.shohinSrchErrForm.productsErr.isEmpty?0:1.2, fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
            ),
          ],
        ),
      )
    );
    contentWidgets.add(
      // 商品名
      Container(
        margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
        padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
        decoration: CommUtils.commBoxDecoration(),
        child:Column(

          children:<Widget>[TextFormField(
              controller: _productsnameController,
              decoration: const InputDecoration(
                labelText: "商品名",
                hintText: '全角前方一致',
              ),
            ),
            Text(
              // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
              _shohinSrchForm.shohinSrchErrForm.productsnameErr.join("\n"),
              textAlign: TextAlign.left,
              overflow: TextOverflow.clip,
              style: TextStyle(height:_shohinSrchForm.shohinSrchErrForm.productsnameErr.isEmpty?0:1.2, fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
            ),
          ],
        ),
      )
    );
    contentWidgets.add(Container(
      margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
      padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
      decoration: CommUtils.commBoxDecoration(),
      child:Column (
        children: <Widget>[
          //Wrapによって折り返しするが、SizeBox使って左寄せする
          SizedBox(
            width: double.infinity,
            child:Wrap(
               direction: Axis.horizontal,
              children: <Widget>[

                const Text("業種ID",
                  overflow: TextOverflow.clip,
                ),
                DropdownButton(

_shohinSrchForm.publicDbELEMENTSにDBエレメントが入っている。

                  items: CommUtils.getItemsFromELEMENTS(_shohinSrchForm.publicDbELEMENTS(_shohinSrchForm.dbELEMENTS, 'biztypeCd', '全て'), _shohinSrchForm.biztypeCd),
                  value: _shohinSrchForm.biztypeCd,
                  icon: const Icon(Icons.arrow_downward),
                  elevation: 16,
                  style: const TextStyle(color: Colors.deepPurple),
                  underline: Container(
                    height: 2,
                    color: Colors.deepPurpleAccent,
                  ),
                  onChanged: (value) {
                    setState(() {

value as String:value as Stringとしないと、Stringに入れることができないので。

                      _shohinSrchForm.biztypeCd = value as String;
                    });
                  },
                ),
              ]
            ),
          ),
          Text(
            // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
            _shohinSrchForm.shohinSrchErrForm.biztypeCdErr.join("\n"),
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
            style: TextStyle(height:(_shohinSrchForm.shohinSrchErrForm.biztypeCdErr.isEmpty)?0:1.2,
                fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
          ),
        ]),
      ),
    );
    contentWidgets.add(Container(
      margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
      padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
      decoration: CommUtils.commBoxDecoration(),
      child:Column (
        children: <Widget>[
          //Wrapによって折り返しするが、SizeBox使って左寄せする
          SizedBox(
            width: double.infinity,
            child:Wrap(
               direction: Axis.horizontal,
              children: <Widget>[

                const Text("種類・大分類",
                  overflow: TextOverflow.clip,
                ),
                DropdownButton(

_shohinSrchForm.publicDbELEMENTSにDBエレメントが入っている。

                  items: CommUtils.getItemsFromELEMENTS(_shohinSrchForm.publicDbELEMENTS(_shohinSrchForm.dbELEMENTS, 'categoryCd', '全て'), _shohinSrchForm.categoryCd),
                  value: _shohinSrchForm.categoryCd,
                  icon: const Icon(Icons.arrow_downward),
                  elevation: 16,
                  style: const TextStyle(color: Colors.deepPurple),
                  underline: Container(
                    height: 2,
                    color: Colors.deepPurpleAccent,
                  ),
                  onChanged: (value)  async {

入力値が既存のcategoryCdと違う場合、CommUtils .createLrgMidChangeを使用してsubcategoryCdのDBエレメントを取得している。

                    if (_shohinSrchForm.categoryCd != value as String) {
                      // httpアクセス
                      Map<String, dynamic>? map = await CommUtils
                          .createLrgMidChange(
                          context,
                          value,
                          '',
                          '2',
                          '/elements/elem',
                          'ary_lrgmidsml_category',
                          widget.headers,
                          widget.cookies);
                      setState(() {
                        _shohinSrchForm.categoryCd = value;
                        _shohinSrchForm.subcategoryCd = '';
                        _shohinSrchForm.extracategoryCd = '';
                        _shohinSrchForm.dbELEMENTS!['subcategoryCd'] = map ?? {};
                        _shohinSrchForm.dbELEMENTS!['extracategoryCd'] = {};
                      });
                    }
                  },
                ),
              ]
            ),
          ),
          Text(
            // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
            _shohinSrchForm.shohinSrchErrForm.categoryCdErr.join("\n"),
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
            style: TextStyle(height:(_shohinSrchForm.shohinSrchErrForm.categoryCdErr.isEmpty)?0:1.2,
                fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
          ),
        ]),
      ),
    );
    contentWidgets.add(Container(
      margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
      padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
      decoration: CommUtils.commBoxDecoration(),
      child:Column (
        children: <Widget>[
          //Wrapによって折り返しするが、SizeBox使って左寄せする
          SizedBox(
            width: double.infinity,
            child:Wrap(
               direction: Axis.horizontal,
              children: <Widget>[

                const Text("種類・中分類",
                  overflow: TextOverflow.clip,
                ),
                DropdownButton(

_shohinSrchForm.publicDbELEMENTSにDBエレメントが入っている。

                  items: CommUtils.getItemsFromELEMENTS(_shohinSrchForm.publicDbELEMENTS(_shohinSrchForm.dbELEMENTS, 'subcategoryCd', '全て'), _shohinSrchForm.subcategoryCd),
                  value: _shohinSrchForm.subcategoryCd,
                  icon: const Icon(Icons.arrow_downward),
                  elevation: 16,
                  style: const TextStyle(color: Colors.deepPurple),
                  underline: Container(
                    height: 2,
                    color: Colors.deepPurpleAccent,
                  ),
                  onChanged: (value) async {

入力値が既存のsubcategoryCdと違う場合、CommUtils .createLrgMidChangeを使用してextracategoryCd のDBエレメントを取得している。

                    if (_shohinSrchForm.subcategoryCd != value as String) {
                      // httpアクセス
                      Map<String, dynamic>? map = await CommUtils
                          .createLrgMidChange(
                          context,
                          _shohinSrchForm.categoryCd,
                          value,
                          '2',
                          '/elements/elem',
                          'ary_lrgmidsml_category',
                          widget.headers,
                          widget.cookies);
                      setState(() {
                        _shohinSrchForm.subcategoryCd = value;
                        _shohinSrchForm.extracategoryCd = '';
                        _shohinSrchForm.dbELEMENTS!['extracategoryCd'] = map ?? {};
                      });
                    }
                  },
                ),
              ]
            ),
          ),
          Text(
            // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
            _shohinSrchForm.shohinSrchErrForm.subcategoryCdErr.join("\n"),
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
            style: TextStyle(height:(_shohinSrchForm.shohinSrchErrForm.subcategoryCdErr.isEmpty)?0:1.2,
                fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
          ),
        ]),
      ),
    );
    contentWidgets.add(Container(
      margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
      padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
      decoration: CommUtils.commBoxDecoration(),
      child:Column (
        children: <Widget>[
          //Wrapによって折り返しするが、SizeBox使って左寄せする
          SizedBox(
            width: double.infinity,
            child:Wrap(
              direction: Axis.horizontal,
              children: <Widget>[

                const Text("種類・小分類",
                  overflow: TextOverflow.clip,
                ),
                DropdownButton(

_shohinSrchForm.publicDbELEMENTSにDBエレメントが入っている。

                  items: CommUtils.getItemsFromELEMENTS(_shohinSrchForm.publicDbELEMENTS(_shohinSrchForm.dbELEMENTS, 'extracategoryCd', '全て'), _shohinSrchForm.extracategoryCd),
                  value: _shohinSrchForm.extracategoryCd,
                  icon: const Icon(Icons.arrow_downward),
                  elevation: 16,
                  style: const TextStyle(color: Colors.deepPurple),
                  underline: Container(
                    height: 2,
                    color: Colors.deepPurpleAccent,
                  ),
                  onChanged: (value) {
                    setState(() {
                      _shohinSrchForm.extracategoryCd= value as String;
                    });
                  },
                ),
              ]
            ),
          ),
          Text(
            // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
            _shohinSrchForm.shohinSrchErrForm.extracategoryCdErr.join("\n"),
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
            style: TextStyle(height:(_shohinSrchForm.shohinSrchErrForm.extracategoryCdErr.isEmpty)?0:1.2,
                fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
          ),
        ]),
      ),
    );
    contentWidgets.add(
      // 公開区分
      Container(
        margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
        padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
        decoration: CommUtils.commBoxDecoration(),
        child:Column(
          children:<Widget>[

            const Text("公開区分",
              overflow: TextOverflow.clip,
            ),
            Column(
              // エレメントがnullということはないので、!(bang operator)を使用し、コンパイルエラーを取り除いた。
              children: Elements.elementsList('OPN_KBN', '全て').map((e) =>
              //チェックボックス
              CheckboxListTile(
                activeColor: Colors.orange,
                title: Text("公開区分"),
                subtitle: Text(e[1]),
                controlAffinity: ListTileControlAffinity.leading,
                value: _shohinSrchForm.openkbn1Array.contains(e[0]),
                onChanged: (value) {
                  setState(() {
                    CommUtils.handleCheckbox(_shohinSrchForm.openkbn1Array, e[0]);
                  });
                }
              )
              ).toList(),
            ),
            Text(
              // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
              _shohinSrchForm.shohinSrchErrForm.checkOpenkbn1ArrayErr.join("\n"),
              textAlign: TextAlign.left,
              overflow: TextOverflow.clip,
              style: TextStyle(height:_shohinSrchForm.shohinSrchErrForm.checkOpenkbn1ArrayErr.isEmpty?0:1.2, fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
            ),
          ],
        ),
      )
    );
    contentWidgets.add(
      // 登録日時
      Container(
        margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
        padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
        decoration: CommUtils.commBoxDecoration(),
        child:Column (
          children: <Widget>[

            // 日付の入力フォーム
            const Text("登録日時",
              overflow: TextOverflow.clip,
            ),
            Row (
              children: <Widget>[
                Container(
                  margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
                  padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
                  child:Text(_shohinSrchForm.insdtFrom==null?"":DateFormat('yyyy/MM/dd').format(_shohinSrchForm.insdtFrom!),
                    textAlign: TextAlign.left,
                    overflow: TextOverflow.clip,
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),

                  child: ElevatedButton(
                    onPressed: () async {
                      DateTime? _date;
                      _date = await CommUtils.openDateDialogComm(context,
                                DateTime.utc(1900, 1, 1), DateTime.utc(2099, 12, 31), _shohinSrchForm.insdtFrom);
                      if (_date != null) {
                        setState(() {
                          _shohinSrchForm.insdtFrom = _date;
                        });
                      }
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("日付選択"),
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),
                  child: ElevatedButton(
                    onPressed: () async {
                      setState(() {
                        _shohinSrchForm.insdtFrom = null;
                      });
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("クリア"),
                  ),
                ),
              ]
            ),

            Text(' ~ ',
            ),
            Row (
              children: <Widget>[
                Container(
                  margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
                  padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
                  child:Text(_shohinSrchForm.insdtTo==null?"":DateFormat('yyyy/MM/dd').format(_shohinSrchForm.insdtTo!),
                    textAlign: TextAlign.left,
                    overflow: TextOverflow.clip,
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),

                  child: ElevatedButton(
                    onPressed: () async {
                      DateTime? _date;
                      _date = await CommUtils.openDateDialogComm(context,
                                DateTime.utc(1900, 1, 1), DateTime.utc(2099, 12, 31), _shohinSrchForm.insdtTo);
                      if (_date != null) {
                        setState(() {
                          _shohinSrchForm.insdtTo = _date;
                        });
                      }
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("日付選択"),
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),
                  child: ElevatedButton(
                    onPressed: () async {
                      setState(() {
                        _shohinSrchForm.insdtTo = null;
                      });
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("クリア"),
                  ),
                ),
              ]
            ),
            Text(
              // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
              _shohinSrchForm.shohinSrchErrForm.insdtFromErr.join("\n") +
              _shohinSrchForm.shohinSrchErrForm.insdtToErr.join("\n") +
              _shohinSrchForm.shohinSrchErrForm.checkInsdtFromInsdtToErr.join("\n"),
              textAlign: TextAlign.left,
              overflow: TextOverflow.clip,
              style: TextStyle(height:(_shohinSrchForm.shohinSrchErrForm.insdtFromErr==[] ||
              _shohinSrchForm.shohinSrchErrForm.insdtToErr==[] ||
              _shohinSrchForm.shohinSrchErrForm.checkInsdtFromInsdtToErr.isEmpty)?0:1.2,
                  fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
            ),
          ]
        ),
      ),
    );
    contentWidgets.add(
      // 更新日時
      Container(
        margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
        padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
        decoration: CommUtils.commBoxDecoration(),
        child:Column (
          children: <Widget>[

            // 日付の入力フォーム
            const Text("更新日時",
              overflow: TextOverflow.clip,
            ),
            Row (
              children: <Widget>[
                Container(
                  margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
                  padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
                  child:Text(_shohinSrchForm.updtFrom==null?"":DateFormat('yyyy/MM/dd').format(_shohinSrchForm.updtFrom!),
                    textAlign: TextAlign.left,
                    overflow: TextOverflow.clip,
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),

                  child: ElevatedButton(
                    onPressed: () async {
                      DateTime? _date;
                      _date = await CommUtils.openDateDialogComm(context,
                                DateTime.utc(1900, 1, 1), DateTime.utc(2099, 12, 31), _shohinSrchForm.updtFrom);
                      if (_date != null) {
                        setState(() {
                          _shohinSrchForm.updtFrom = _date;
                        });
                      }
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("日付選択"),
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),
                  child: ElevatedButton(
                    onPressed: () async {
                      setState(() {
                        _shohinSrchForm.updtFrom = null;
                      });
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("クリア"),
                  ),
                ),
              ]
            ),

            Text(' ~ ',
            ),
            Row (
              children: <Widget>[
                Container(
                  margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
                  padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
                  child:Text(_shohinSrchForm.updtTo==null?"":DateFormat('yyyy/MM/dd').format(_shohinSrchForm.updtTo!),
                    textAlign: TextAlign.left,
                    overflow: TextOverflow.clip,
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),

                  child: ElevatedButton(
                    onPressed: () async {
                      DateTime? _date;
                      _date = await CommUtils.openDateDialogComm(context,
                                DateTime.utc(1900, 1, 1), DateTime.utc(2099, 12, 31), _shohinSrchForm.updtTo);
                      if (_date != null) {
                        setState(() {
                          _shohinSrchForm.updtTo = _date;
                        });
                      }
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("日付選択"),
                  ),
                ),
                Container(
                  margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
                  padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),
                  child: ElevatedButton(
                    onPressed: () async {
                      setState(() {
                        _shohinSrchForm.updtTo = null;
                      });
                    },
                    style: ElevatedButton.styleFrom(
                      primary: Colors.blue,
                    ),
                    child: const Text("クリア"),
                  ),
                ),
              ]
            ),
            Text(
              // HTTPで返却されたエラーメッセージを表示する。(エラーなしはText高=0にしている)
              _shohinSrchForm.shohinSrchErrForm.updtFromErr.join("\n") +
              _shohinSrchForm.shohinSrchErrForm.updtToErr.join("\n") +
              _shohinSrchForm.shohinSrchErrForm.checkUpdtFromUpdtToErr.join("\n"),
              textAlign: TextAlign.left,
              overflow: TextOverflow.clip,
              style: TextStyle(height:(_shohinSrchForm.shohinSrchErrForm.updtFromErr==[] ||
              _shohinSrchForm.shohinSrchErrForm.updtToErr==[] ||
              _shohinSrchForm.shohinSrchErrForm.checkUpdtFromUpdtToErr.isEmpty)?0:1.2,
                  fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
            ),
          ]
        ),
      ),
    );

    contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

          child: ElevatedButton(
            // 情報一覧リストへ、list_do、httpアクセス
            onPressed: httpForListDo,
            style: ElevatedButton.styleFrom(
              primary: Colors.blue,
            ),
            child: const Text("検索"),
          ),
        )
    );
    return contentWidgets;
  }

  // 一覧表を表示するWidgets

_makeListWidgetsメソッドはリストタブ。

  List<Widget> _makeListWidgets() {
    var contentWidgets = List<Widget>.empty(growable: true);
    //var contentWidgets = <Widget>[];
    if (_errorSuccessMsg.isNotEmpty) {
      contentWidgets.add(

        // エラーメッセージ
          Container(
            padding: const EdgeInsets.fromLTRB(20.0, 10, 20.0, 5.0),
            child: Text(_errorSuccessMsg,
              textAlign: TextAlign.center,
              overflow: TextOverflow.clip,
              style: const TextStyle(
                  fontWeight: FontWeight.bold, color: Colors.red),),
          )
      );
    }

次ページに続く