Chapter 06

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

kazpgm
kazpgm
2022.06.14に更新

前ページからのつづき

shohin_list.dartの続き
    if (_shohinSrchForm.messageForm.pageObjSize == 0) {

pageObjSize=0の時は、一覧リストが0件。

      contentWidgets.add(Container(
        padding: const EdgeInsets.fromLTRB(20.0, 20, 20.0, 5.0),
        child:const Text("該当するデータがありませんでした。",
          textAlign: TextAlign.center,
          overflow: TextOverflow.clip,
          style: TextStyle(fontWeight: FontWeight.bold, color: Colors.red),),
      ),);
    } else {

      contentWidgets.add(Center(
        // ページ指定選択
        child:Wrap(
          //mainAxisAlignment: MainAxisAlignment.center,
          direction: Axis.horizontal,
          children: <Widget>[
            DropdownButton(
              items: CommUtils.getPageDropDown(5,
                  _shohinSrchForm.messageForm.pageObjSize,
                  _shohinSrchForm.messageForm.pageObjTotalPages,
                  _shohinSrchForm.messageForm.page),
              value: _shohinSrchForm.messageForm.page>0?_shohinSrchForm.messageForm.page-1:0,
              icon: const Icon(Icons.arrow_downward),
              elevation: 16,
              style: const TextStyle(color: Colors.deepPurple),
              underline: Container(
                height: 2,
                color: Colors.deepPurpleAccent,
              ),
              onChanged: (value) {
                setState(() {
                  // ページ指定可能な物のみ処理する
                  int intWk = (value as int);
                  // -20以下または、0以上(-1から-19の時は何もしない)
                  if (intWk <= -20 || intWk >= 0) {
                    if (intWk <= -20) {
                      // -20よりマイナスの時は、+20して*-1して正の値にし、+1(画面用ページ番号は+1するので)する。
                      intWk = (intWk + 20) * -1 + 1;
                    } else {
                      // +1(画面用ページ番号は+1するので)する。
                      intWk += 1;
                    }
                    if (intWk != _shohinSrchForm.messageForm.page) {
                      _shohinSrchForm.messageForm.page = intWk;
                      // 情報一覧リストへ、list_backで、httpアクセス
                      httpForListBack();
                    }
                  }
                }
                );
              },
            ),
            // 並び順選択
          const Text("  ",
            overflow: TextOverflow.clip,
          ),

          DropdownButton(
            items: CommUtils.getItems(_selectItemNames, _selectItem, _shohinSrchForm.srchOrderForm.sortOrder),
            value: _selectItem,
            icon: const Icon(Icons.arrow_downward),
            elevation: 16,
            style: const TextStyle(color: Colors.deepPurple),
            underline: Container(
              height: 2,
              color: Colors.deepPurpleAccent,
            ),
            onChanged: (value) {
              setState(() {
                // 違う項目名が選択された場合、並び順は””にする
                if (value != _selectItem) {
                  _shohinSrchForm.srchOrderForm.sortOrder = "";
                }
                _selectItem = value as int;
                _shohinSrchForm.srchOrderForm.sortItemName= _selectItems[_selectItem];
                // 情報一覧リストへ、list_up_dwnで、httpアクセス
                httpForListUpDwn();
              });
            },
          ),
        ]),
      ),
      );
      // 情報一覧リスト
      int i = 0;
      for (var element in _shohinSrchForm.resListForm) {
        i++;
        contentWidgets.add(Container(
            margin: const EdgeInsets.fromLTRB(10.0, 5, 10.0, 0),
            padding: const EdgeInsets.fromLTRB(10.0, 5, 10.0, 0),
            decoration: CommUtils.commBoxDecoration(),
            child:Column(
              // 左寄せする
              crossAxisAlignment: CrossAxisAlignment.start,

children: _makeListWidgetItems(i, element)は1データ分をList<Widget> を戻している。

              children: _makeListWidgetItems(i, element),
            ),
          ),
        );
      }
    }
    return contentWidgets;
  }

  // 一覧表を表示するWidgetsの各項目設定
  List<Widget> _makeListWidgetItems(int i, var element) {
    var contentWidgets = List<Widget>.empty(growable: true);
    //var contentWidgets = <Widget>[];
    contentWidgets.add(
      Container(
        padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5.0),
        width: double.infinity,

Noを1~順に表示している。

        child: Text("№ : "  + i.toString(),
        textAlign: TextAlign.left,
        overflow: TextOverflow.clip,
        ),
      ),
    );

項目値が入っている場合

    if (CommUtils.chgToString(element["products"]) != "") {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),


CommUtils.getSortOrderMarkで昇順降順を表示している。

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'products') + '商品CD
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'products') + '商品CD : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (CommUtils.chgToString(element["productsname"]) != "") {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'productsname') + '商品名
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'productsname') + '商品名 : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (element["biztypeCdObj"] != null) {
      contentWidgets.add(
        // 業種ID
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'biztypeCd') + '業種ID
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'biztypeCd') + '業種ID : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (element["categoryCdObj"] != null) {
      contentWidgets.add(
        // 種類・大分類
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'categoryCd') + '種類・大分類
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'categoryCd') + '種類・大分類 : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (element["subcategoryCdObj"] != null) {
      contentWidgets.add(
        // 種類・中分類
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'subcategoryCd') + '種類・中分類
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'subcategoryCd') + '種類・中分類 : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (element["extracategoryCdObj"] != null) {
      contentWidgets.add(
        // 種類・小分類
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'extracategoryCd') + '種類・小分類
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'extracategoryCd') + '種類・小分類 : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (element["openkbn1Name"].isNotEmpty) {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'openkbn1') + '公開区分
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'openkbn1') + '公開区分 : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (element["insdt"].isNotEmpty) {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'insdt') + '登録日時
                DateFormat('yyyy/MM/dd HH:mm:ss').format(
                  (DateTime.parse(element["insdt"])).add(const Duration(hours:9))),
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'insdt') + '登録日時 : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

項目値が入っている場合

    if (element["updt"].isNotEmpty) {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),

Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'updt') + '更新日時
                DateFormat('yyyy/MM/dd HH:mm:ss').format(
                  (DateTime.parse(element["updt"])).add(const Duration(hours:9))),
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    } else {
      contentWidgets.add(
        Container(
          margin: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 5),
          padding: const EdgeInsets.fromLTRB(10.0, 0, 10.0, 0),
          child:Text(CommUtils.getSortOrderMark(_shohinSrchForm.srchOrderForm, 'updt') + '更新日時 : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
        )
      );
    }

    contentWidgets.add(
      Row (
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Container(
            margin: const EdgeInsets.fromLTRB(5, 0, 5, 5),
            padding: const EdgeInsets.fromLTRB(5, 0, 5, 0),

            child: ElevatedButton(
              // 情報一覧リストへ、detail、httpアクセス
              onPressed: (){httpForDetail(element["products"]);},
              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(
              // 情報一覧リストへ、upd、httpアクセス
              onPressed: (){httpForUpd(element["products"]);},
              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 {
                String? _str = await CommUtils.openDialogComm(context, '削除してもよろしいですか?') ;
                if (_str == Consts.ok) {
                  // 情報一覧リストへ、del_do、httpアクセス
                  httpForDelDo(element["products"]);
                }
              },
              style: ElevatedButton.styleFrom(
                primary: Colors.blue,
              ),
              child: const Text("削除"),
            ),
          ),
        ]
      ),
    );
    return contentWidgets;
  }

  /// 情報一覧リストへ、list_do、httpアクセス
  void httpForListDo() {
    httpForList("list_do", "${Consts.myHttpUrl}/members/admin/shohin/shohin/list_do");
  }
  /// 情報一覧リストへ、list_up_dwnで、httpアクセス
  void httpForListUpDwn() {
    httpForList("list_up_dwn", "${Consts.myHttpUrl}/members/admin/shohin/shohin/list_up_dwn");
  }
  /// 情報一覧リストへ、list_backで、httpアクセス
  void httpForListBack() {
    httpForList("list_back", "${Consts.myHttpUrl}/members/admin/shohin/shohin/list_back");
  }
  /// 情報一覧リストへ、detailで、httpアクセス
  void httpForDetail(String _products) {
    httpForInfo("detail", "${Consts.myHttpUrl}/members/admin/shohin/shohin/detail", _products);
  }
  /// 情報一覧リストへ、updで、httpアクセス
  void httpForUpd(String _products) {
    httpForInfo("upd", "${Consts.myHttpUrl}/members/admin/shohin/shohin/upd", _products);
  }
  /// 情報一覧リストへ、del_doで、httpアクセス
  void httpForDelDo(String _products) {
    httpForInfo("del_do", "${Consts.myHttpUrl}/members/admin/shohin/shohin/del_do", _products);
  }

  /// 情報一覧リストへのhttpアクセス
  void httpForList(String _mode, String _url) async {
    try {

情報一覧リストへのhttpアクセス
_shohinSrchForm.fromShohinSrchFormControllerメソッドで、TextFormField値を、Formに設定。補足:TextFormField以外は直接Formを見ている。

      // TextFormField値を、Formに設定。補足:TextFormField以外は直接Formを見ている。
      _shohinSrchForm.fromShohinSrchFormController(
          _productsController,
          _productsnameController,
      );
      String _json = '';
      if (_mode == 'list_up_dwn' || _mode == 'list_back') {
        SrchOrderFormInMsgForm srchOrderFromInMsgForm = SrchOrderFormInMsgForm.initData();
        srchOrderFromInMsgForm.srchOrderForm = _shohinSrchForm.srchOrderForm;
        srchOrderFromInMsgForm.messageForm = _shohinSrchForm.messageForm;
        _json = srchOrderFromInMsgForm.toJson(
            _mode, "${widget.cookies['XSRF-TOKEN']}",
            _shohinSrchForm.messageForm.page);
      } else {
        _json = _shohinSrchForm.toJson(
            _mode, "${widget.cookies['XSRF-TOKEN']}",
            _shohinSrchForm.messageForm.page);
      }
      widget.headers["content-type"]= "application/json; charset=UTF-8";
      widget.headers["X-XSRF-TOKEN"]= "${widget.cookies['XSRF-TOKEN']}";
      final url = Uri.parse(_url);

headersでcsrfとJsessionを渡している。
HTTPで、情報を取得している。

      http.Response response = await http.post(url,headers: widget.headers, body: _json);
      if (response.statusCode != 200) {
        // 検索(エラーメッセージ欄がある)表示
        _selectedIndex = 0;
        setState(() {
          int statusCode = response.statusCode;

response.statusCodeが200(正常)以外のとき
・ログインが必要な時は "ログインしてください"
・それ以外のステータスの時は”エラーが発生しました ”を表示している。

          if (response.statusCode == 401 || response.statusCode == 403) {
            _errorSuccessMsg = "ログインしてください";
          } else {
            _errorSuccessMsg = "エラーが発生しました $statusCode";
          }
        });
        // 画面を先頭に戻す
        _scrollController.animateTo(0,
            duration: const Duration(milliseconds:600),
            curve: Curves.easeInQuint);
        return;
      }

HTTPヘッダー内容を保存している

      CommUtils.updateCookie(response, widget.cookies, widget.headers);

HTTPのresponse.bodyをString形式にしている。

      // response.bodyをutf8でdecodeする。
      String _resData = utf8.decode(response.body.runes.toList());
      if (kDebugMode) {
        print(_resData);
      }
      // バックエンドで例外発生の場合MessageFormの値しか戻らないため、ここで確認する
      MessageForm _messageForm = MessageForm.initData();
      _messageForm.fromJson(_resData);

バックエンドで例外発生の場合MessageFormの値しか戻らないため、ここで確認する。

      // SpringBootで例外発生の場合
      if (_messageForm.mode =="SystemError") {

エラー画面(Error)を表示している。

        // エラー画面
        Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) => Error(title: widget.title, username: widget.username,
                headers: widget.headers, cookies: widget.cookies, resData: _resData),
          ),
        );
        // 正常処理
      } else {
        setState(() {
          // 検索結果リスト表示

リストタブにする。

          _selectedIndex = 1;
          _shohinSrchForm.fromJson(_resData);

HTTPの戻りを_shohinSrchFormに設定する。

            // From値を、TextFormFieldに設定する
            _shohinSrchForm.forShohinSrchFormController(
                _productsController,
                _productsnameController,
            );
          _errorSuccessMsg =
              _shohinSrchForm.messageForm.errorMessage + _shohinSrchForm.messageForm.successMessage;
          if (_errorSuccessMsg == '' &&
              _shohinSrchForm.messageForm.itemErrorMessages != '') {
            _errorSuccessMsg = '項目エラーを確認してください';

項目エラーがあるときは、検索タブにする。

            // 検索画面表示
            _selectedIndex = 0;
          }
          // 並び順指定があればドロップダウンリストはそれにする。
          if (_shohinSrchForm.srchOrderForm.sortItemName == "") {
            _selectItem = 0;
          } else {
            for (int i = 0; i < _selectItems.length; i++) {
              if (_selectItems[i] == _shohinSrchForm.srchOrderForm.sortItemName) {
                _selectItem = i;
                break;
              }
            }
          }
        });
      }
    } catch (e) {
      setState(() {
        if (kDebugMode) {
          print("エラーが発生しました" + e.toString());
        }

例外が発生した時エラー表示。

        _errorSuccessMsg = "内部エラーが発生しました";
      });
    }

HTTPで取得した内容表示後画面を先頭に戻している。

    // 画面を先頭に戻す
    _scrollController.animateTo(0,
        duration: const Duration(milliseconds:600),
        curve: Curves.easeInQuint);
  }

情報詳細、情報変更、情報削除へのhttpアクセス

  /// 情報詳細、情報変更、情報削除へのhttpアクセス
  void httpForInfo(String _mode, String _url, String _products) async {
    try {
      ShohinForm _shohinForm = ShohinForm.initData();
      _shohinForm.products = _products;
      String _shohinFormJson = _shohinForm.toJson(_mode, "${widget.cookies['XSRF-TOKEN']}", _shohinSrchForm.messageForm.page);
      widget.headers["content-type"]= "application/json; charset=UTF-8";
      widget.headers["X-XSRF-TOKEN"]= "${widget.cookies['XSRF-TOKEN']}";
      final url = Uri.parse(_url);

headersでcsrfとJsessionを渡している。
HTTPで情報を取得している。

      http.Response response = await http.post(url,headers: widget.headers, body: _shohinFormJson);
      if (response.statusCode != 200) {
        setState(() {
          int statusCode = response.statusCode;

response.statusCodeが200(正常)以外のとき
・ログインが必要な時は "ログインしてください"
・それ以外のステータスの時は”エラーが発生しました ”を表示している。

          if (response.statusCode == 401 || response.statusCode == 403) {
            _errorSuccessMsg = "ログインしてください";
          } else {
            _errorSuccessMsg = "エラーが発生しました $statusCode";
          }
        });
        // 画面を先頭に戻す
        _scrollController.animateTo(0,
            duration: const Duration(milliseconds:600),
            curve: Curves.easeInQuint);
        return;
      }
      CommUtils.updateCookie(response, widget.cookies, widget.headers);

HTTPヘッダー内容を保存している
HTTPのresponse.bodyをString形式にしている。

      // response.bodyをutf8でdecodeする。
      String _resData = utf8.decode(response.body.runes.toList());
      if (kDebugMode) {
        print(_resData);
      }
      MessageForm _messageForm = MessageForm.initData();
      _messageForm.fromJson(_resData);

バックエンドで例外発生の場合MessageFormの値しか戻らないため、ここで確認する。

      // SpringBootで例外発生の場合
      if (_messageForm.mode =="SystemError") {

エラー画面(Error)を表示している。

        // エラー画面
        Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) => Error(title: widget.title, username: widget.username,
                headers: widget.headers, cookies: widget.cookies, resData: _resData),
          ),
        );
        // 正常処理
      } else {

mode == detailの時は、情報詳細(ShohinDetail)を表示している。

        if (_messageForm.mode == 'detail') {
          //情報登録
          Navigator.of(context).push(
            MaterialPageRoute(
              builder: (context) =>
                  ShohinDetail(title: widget.title,
                      username: widget.username,
                      headers: widget.headers,
                      cookies: widget.cookies,
                      resData: _resData),
            ),
          );
        } else if (_messageForm.mode == 'upd') {

mode == updの時は、情報登録更新(ShohinRegisterAmend)を表示している。mode=updなので情報更新画面になる。

          //情報登録
          Navigator.of(context).push(
            MaterialPageRoute(
              builder: (context) =>
                  ShohinRegisterAmend(title: widget.title,
                      username: widget.username,
                      headers: widget.headers,
                      cookies: widget.cookies,
                      resData: _resData),
            ),
          );
          // _mode=='list_back'(エラーになった場合または、削除OK)を想定
        } else {
          setState(() {
            // 検索結果リスト表示

リストタブにする。

            _selectedIndex = 1;

HTTPの戻りを_shohinSrchFormに設定する。

            _shohinSrchForm.fromJson(_resData);
              // From値を、TextFormFieldに設定する
              _shohinSrchForm.forShohinSrchFormController(
                  _productsController,
                  _productsnameController,
              );
            _errorSuccessMsg =
                _shohinSrchForm.messageForm.errorMessage + _shohinSrchForm.messageForm.successMessage;
            if (_errorSuccessMsg == '' &&
                _shohinSrchForm.messageForm.itemErrorMessages != '') {
              _errorSuccessMsg = '項目エラーを確認してください';
              // 検索画面表示
              _selectedIndex = 0;
            }

項目エラーがあるときは、検索タブにする。

            // 並び順指定があればドロップダウンリストはそれにする。
            if (_shohinSrchForm.srchOrderForm.sortItemName == "") {
              _selectItem = 0;
            } else {
              for (int i = 0; i < _selectItems.length; i++) {
                if (_selectItems[i] == _shohinSrchForm.srchOrderForm.sortItemName) {
                  _selectItem = i;
                  break;
                }
              }
            }
          });
          // 画面を先頭に戻す
          _scrollController.animateTo(0,
              duration: const Duration(milliseconds:600),
              curve: Curves.easeInQuint);
        }
      }
    } catch (ex) {
      setState(() {
        if (kDebugMode) {

例外が発生した時エラー表示。

          print("エラーが発生しました" + ex.toString());
        }
        _errorSuccessMsg = "内部エラーが発生しました";
      });
    }
  }

  
  void initState() {
    super.initState();
    // 画面初期データを設定する
    _shohinSrchForm = ShohinSrchForm.initData();

HTTPで取得した内容を _shohinSrchFormに設定している

    _shohinSrchForm.fromJson(widget.resData);
    // From値を、TextFormFieldに設定する
    _shohinSrchForm.forShohinSrchFormController(
        _productsController,
        _productsnameController,
    );

商品名の入力項目(TextFormField)は、入力値表示のための_productsController、_productsnameController(TextEditingController)に設定している。
mode == 'list_back'の時は、リストタブ画面表示とする。

    if (_shohinSrchForm.messageForm.mode == 'list_back') {
      _selectedIndex = 1;
    }
    _scrollController= ScrollController();
    _errorSuccessMsg =
        _shohinSrchForm.messageForm.errorMessage + _shohinSrchForm.messageForm.successMessage;
    if (_errorSuccessMsg == '' &&
        _shohinSrchForm.messageForm.itemErrorMessages != '') {
      _errorSuccessMsg = '項目エラーを確認してください';
      // 検索画面表示

入力エラーがある時は、検索タブ画面表示とする。

      _selectedIndex = 0;
    }
    // 並び順指定があればドロップダウンリストはそれにする。
    if (_shohinSrchForm.srchOrderForm.sortItemName == "") {
      _selectItem = 0;
    } else {
      for (int i = 0; i < _selectItems.length; i++) {

並び順指定があればドロップダウンリストはそれにする。

        if (_selectItems[i] == _shohinSrchForm.srchOrderForm.sortItemName) {
          _selectItem = i;
          break;
        }
      }
    }
  }

  
  void dispose() {

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

    _scrollController.dispose();
    // Clean up the focus node when the Form is disposed.
    super.dispose();
  }
}