フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成勉強中
9:21
①昨日の11:44のつづき。
これからのフロントFlutter側のuser_form.dart(MessageFormを包含している)の「プロパティ エラーメッセージ用変数」を別のクラス(UserErrFormクラスを作成)にして包含するように修正する。
■修正後のuser_form.dart
import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter_app/form/user_err_form.dart'; import 'message_form.dart'; /// ユーザー情報画面Form class UserForm { //プロパティ 入出力データ用 late int id; // ID late String name; // 名前 late String email; // メールアドレス late String password; // パスワード late String passwordConfirm; // パスワード確認 late List<String> rolesArray; // ロール late String roles; // ロール (詳細表示用) // バックエンド(SpringBoot)のFormでBooleanだけどStringで処理する late String enableFlag; // 可否フラグ //プロパティ エラーメッセージ late UserErrForm userErrForm; // プロパティ エラーメッセージ // 共通・メッセージ late MessageForm messageForm; // 共通・メッセージ /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「UserForm(this.name,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している UserForm.initData() { //入出力データ用 id = 0; name = ""; email = ""; password = ""; passwordConfirm = ""; rolesArray = <String>[]; roles = ""; enableFlag = ""; // プロパティ エラーメッセージ userErrForm = UserErrForm.initData(); // 共通・メッセージ messageForm = MessageForm.initData(); } /// HTTPレスポンスデータを反映する fromJson(String resData) { Map<String,dynamic> _resDataMap = jsonDecode(resData); //入出力データ用 if (_resDataMap["resForm"]==null) { id = 0; name = ""; email = ""; password = ""; passwordConfirm = ""; rolesArray = <String>[]; roles = ""; enableFlag = ""; } else { id = _resDataMap["resForm"]["id"] ?? 0; name = _resDataMap["resForm"]["name"] ?? ""; email = _resDataMap["resForm"]["email"] ?? ""; password = _resDataMap["resForm"]["password"] ?? ""; passwordConfirm = _resDataMap["resForm"]["passwordConfirm"] ?? ""; //jsonから読み込んだときのエラー(”type 'List<dynamic>' is not a subtype of type 'List<String>'”)に // 対応し、".cast<String>()"でキャストした rolesArray = _resDataMap["resForm"]["rolesArray"]!=null?_resDataMap["resForm"]["rolesArray"].cast<String>():<String>[]; roles = _resDataMap["resForm"]["roles"] ?? ""; enableFlag = ""; if (_resDataMap["resForm"]["enableFlag"] != null) { if (_resDataMap["resForm"]["enableFlag"]) { enableFlag = "true"; } else { enableFlag = "false"; } } } // プロパティ エラーメッセージ userErrForm.fromJson(resData); // 共通・メッセージ messageForm.fromJson(resData); } /// HTTPレスポンスデータを作成する Map<String,dynamic> toJsonMap (String _mode, String _csrf, int page) { Map<String,dynamic> userFormMap = { 'id': id, 'name': name, 'email': email, 'password': password, 'passwordConfirm': passwordConfirm, 'rolesArray': rolesArray, 'enableFlag': enableFlag, }; Map<String,dynamic> rtnMap = { 'userForm': userFormMap, 'formComm': messageForm.toJsonMap(_mode, _csrf, page), }; return rtnMap; } /// http.postのbodyで使用するJsonデータを返却する String toJson(String _mode, String _csrf, [int page=1]) { return json.encode(toJsonMap(_mode, _csrf, page)); } /// 入出力データを、TextFormFieldに設定する forUserFormController( TextEditingController nameController, TextEditingController emailController, TextEditingController passwordController, TextEditingController passwordConfirmController ) { nameController.text = name; emailController.text = email; passwordController.text = password; passwordConfirmController.text = passwordConfirm; } /// TextFormField値を、入出力データに設定する fromUserFormController( TextEditingController nameController, TextEditingController emailController, TextEditingController passwordController, TextEditingController passwordConfirmController ) { name = nameController.text; email = emailController.text; password = passwordController.text; passwordConfirm = passwordConfirmController.text; } }
■修正後のuser_err_form.dart
import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'message_form.dart'; /// ユーザー情報画面プロパティ エラーメッセージ用Form class UserErrForm { //プロパティ エラーメッセージ用 late List<String> idErr; // ID late List<String> nameErr; // 名前 late List<String> emailErr; // メールアドレス late List<String> passwordErr; // パスワード late List<String> passwordConfirmErr; // パスワード確認 late List<String> checkPasswordPasswordConfirmErr; // パスワード、パスワード確認の相関チェック late List<String> rolesArrayErr; // ロール late List<String> enableFlagErr; // 可否フラグ /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「UserForm(this.name,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している UserErrForm.initData() { //エラーメッセージ用 idErr = <String>[]; nameErr = <String>[]; emailErr = <String>[]; passwordErr = <String>[]; passwordConfirmErr = <String>[]; checkPasswordPasswordConfirmErr = <String>[]; rolesArrayErr = <String>[]; enableFlagErr = <String>[]; } /// HTTPレスポンスデータを反映する fromJson(String resData) { Map<String,dynamic> _resDataMap = jsonDecode(resData); //エラーメッセージ用 if (_resDataMap["resErrorData"]==null) { idErr = <String>[]; nameErr = <String>[]; emailErr = <String>[]; passwordErr = <String>[]; passwordConfirmErr = <String>[]; checkPasswordPasswordConfirmErr = <String>[]; rolesArrayErr = <String>[]; enableFlagErr = <String>[]; } else { idErr = _resDataMap["resErrorData"]["userForm.id"]!=null?_resDataMap["resErrorData"]["userForm.id"].cast<String>():<String>[]; nameErr = _resDataMap["resErrorData"]["userForm.name"]!=null?_resDataMap["resErrorData"]["userForm.name"].cast<String>():<String>[]; emailErr = _resDataMap["resErrorData"]["userForm.email"]!=null?_resDataMap["resErrorData"]["userForm.email"].cast<String>():<String>[]; passwordErr = _resDataMap["resErrorData"]["userForm.password"]!=null?_resDataMap["resErrorData"]["userForm.password"].cast<String>():<String>[]; passwordConfirmErr = _resDataMap["resErrorData"]["userForm.passwordConfirm"]!=null?_resDataMap["resErrorData"]["userForm.passwordConfirm"].cast<String>():<String>[]; checkPasswordPasswordConfirmErr = _resDataMap["resErrorData"]["userForm.checkPasswordPasswordConfirm"]!=null?_resDataMap["resErrorData"]["userForm.checkPasswordPasswordConfirm"].cast<String>():<String>[]; rolesArrayErr = _resDataMap["resErrorData"]["userForm.rolesArray"]!=null?_resDataMap["resErrorData"]["userForm.rolesArray"].cast<String>():<String>[]; enableFlagErr = _resDataMap["resErrorData"]["userForm.enableFlag"]!=null?_resDataMap["resErrorData"]["userForm.enableFlag"].cast<String>():<String>[]; } } }
■修正後のmessage_form.dart
import 'dart:convert'; /// 共通・メッセージForm。各、Formのベースクラス class MessageForm { //プロパティ 実行結果メッセージ用 late String itemErrorMessages; // 項目エラーメッセージ late String errorMessage; // 実行結果エラーメッセージ late String successMessage; // 実行結果OKメッセージ //そのた late String mode; // モード late int page; // ページ番号 late int pageObjSize; // 検索結果の当ページの行数 late int pageObjTotalPages; // 検索結果の総ページ数 /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「MessageForm(this.name,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している MessageForm.initData() { //実行結果メッセージ用 itemErrorMessages = ""; errorMessage = ""; successMessage = ""; //そのた mode = ""; page = 1; pageObjSize = 0; pageObjTotalPages = 0; } /// http.postのbodyで使用するJsonデータを返却する String toJson(String _mode, String _csrf, [int page=1]) { return json.encode(toJsonMap(_mode, _csrf, page)); } /// HTTPレスポンスデータを反映する fromJson(String resData) { Map<String,dynamic> _resDataMap = jsonDecode(resData); //実行結果メッセージ用 itemErrorMessages = _resDataMap["itemErrorMessages"] ?? ""; errorMessage = _resDataMap["errorMessage"] ?? ""; successMessage = _resDataMap["successMessage"] ?? ""; //そのた mode = _resDataMap["mode"] ?? ""; Map<String,dynamic> pageObj; // 検索結果のページ情報 if (_resDataMap["pageObj"]==null || _resDataMap["pageObj"].length < 1) { pageObj = {}; page = _resDataMap["resForm"]["page"] ?? 1; pageObjSize = 0; pageObjTotalPages = 0; } else { pageObj = _resDataMap["pageObj"]; page = pageObj["pageNumber"] + 1; pageObjSize = pageObj["size"]; pageObjTotalPages = pageObj["totalPages"]; } } /// HTTPレスポンスデータを作成する Map<String,dynamic> toJsonMap (String _mode, String _csrf, int page) { Map<String,dynamic> rtnMap = { 'mode': _mode, '_csrf': _csrf, 'page': page, }; return rtnMap; } }
16:58
①上記のつづき。
フロントFlutter側のuser_srch_form.dartも同じように、UserSrchErrForm、SrchOrderForm(SrchOrderErrFormを包含する)、MessageFormを包含するように修正する。
■修正後のuser_srch_form.dart
import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter_app/form/comm/srch_order_form.dart'; import 'package:flutter_app/form/user_srch_err_form.dart'; import 'comm/message_form.dart'; /// ユーザー情報検索画面Form class UserSrchForm { //プロパティ 入出力データ用 late String name; // 名前 late String email; // メールアドレス late String roles; // ロール late String enableFlag; // 可否フラグ late List<dynamic> resListForm; // 情報一覧 // プロパティ エラーメッセージ late UserSrchErrForm userSrchErrForm; // プロパティ エラーメッセージ // 共通・検索ソート順Form late SrchOrderForm srchOrderForm; // 共通・検索ソート順Form // 共通・メッセージ late MessageForm messageForm; // 共通・メッセージ /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「クラス名(this.name,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している UserSrchForm.initData() { //入出力データ用 name = ""; email = ""; roles = ""; enableFlag = ""; //出力データ用 resListForm = [{}]; // プロパティ エラーメッセージ userSrchErrForm = UserSrchErrForm.initData(); // 共通・検索ソート順Form srchOrderForm = SrchOrderForm.initData(); // 共通・メッセージ messageForm = MessageForm.initData(); } /// HTTPレスポンスデータを反映する fromJson(String resData) { Map<String,dynamic> _resDataMap = jsonDecode(resData); //入出力データ用 if (_resDataMap["resForm"]==null) { name = ""; email = ""; roles = ""; enableFlag = ""; } else { name = _resDataMap["resForm"]["name"] ?? ""; email = _resDataMap["resForm"]["email"] ?? ""; roles = _resDataMap["resForm"]["roles"] ?? ""; enableFlag = _resDataMap["resForm"]["enableFlag"] ?? ""; } //出力データ用 if (_resDataMap["resListForm"]==null) { resListForm = [{}]; } else { resListForm = _resDataMap["resListForm"]; } // プロパティ エラーメッセージ userSrchErrForm.fromJson(resData); // 共通・検索ソート順Form srchOrderForm.fromJson(resData); // 共通・メッセージ messageForm.fromJson(resData); } /// HTTPレスポンスデータを作成する Map<String,dynamic> toJsonMap (String _mode, String _csrf, [int page=1]) { Map<String,dynamic> userSrchFormMap = { 'name': name, 'email': email, 'roles': roles, 'enableFlag': enableFlag, }; Map<String,dynamic> rtnMap = { 'userSrchForm': userSrchFormMap, 'srchOrderForm': srchOrderForm.toJsonMap(_mode, _csrf, page), 'formComm': messageForm.toJsonMap(_mode, _csrf, page), }; return rtnMap; } /// http.postのbodyで使用するJsonデータを返却する String toJson(String _mode, String _csrf, [int page=1]) { return json.encode(toJsonMap(_mode, _csrf, page)); } /// 入出力データを、TextFormFieldに設定する forUserSrchFormController( TextEditingController nameController, TextEditingController emailController, ) { nameController.text = name; emailController.text = email; } /// TextFormField値を、入出力データに設定する fromUserSrchFormController( TextEditingController nameController, TextEditingController emailController, ) { name = nameController.text; email = emailController.text; } }
■修正後のuser_srch_err_form.dart
import 'dart:convert'; /// ユーザー情報画面プロパティ エラーメッセージ用Form class UserSrchErrForm { //プロパティ エラーメッセージ用 late List<String> nameErr; // 名前 late List<String> emailErr; // メールアドレス late List<String> rolesErr; // ロール late List<String> enableFlagErr; // 可否フラグ /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「クラス名(this.name,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している UserSrchErrForm.initData() { //エラーメッセージ用 nameErr = <String>[]; emailErr = <String>[]; rolesErr = <String>[]; enableFlagErr = <String>[]; } /// HTTPレスポンスデータを反映する fromJson(String resData) { Map<String,dynamic> _resDataMap = jsonDecode(resData); //エラーメッセージ用 if (_resDataMap["resErrorData"]==null) { nameErr = <String>[]; emailErr = <String>[]; rolesErr = <String>[]; enableFlagErr = <String>[]; } else { nameErr = _resDataMap["resErrorData"]["name"]!=null?_resDataMap["resErrorData"]["name"].cast<String>():<String>[]; emailErr = _resDataMap["resErrorData"]["email"]!=null?_resDataMap["resErrorData"]["email"].cast<String>():<String>[]; rolesErr = _resDataMap["resErrorData"]["roles"]!=null?_resDataMap["resErrorData"]["roles"].cast<String>():<String>[]; enableFlagErr = _resDataMap["resErrorData"]["enableFlag"]!=null?_resDataMap["resErrorData"]["enableFlag"].cast<String>():<String>[]; } } }
■修正後のsrch_order_form.dart
import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter_app/form/comm/message_form.dart'; import 'package:flutter_app/form/comm/srch_order_err_form.dart'; /// 共通・検索ソート順Formのベースクラス class SrchOrderForm { //プロパティ 入出力データ用 late String sortItemName; late String sortOrder; late String updMode; // プロパティ エラーメッセージ late SrchOrderErrForm srchOrderErrForm; // プロパティ エラーメッセージ /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「クラス名(this.sortItemName,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している SrchOrderForm.initData() { //入出力データ用 sortItemName = ""; sortOrder = ""; updMode = "lstMode"; // プロパティ エラーメッセージ srchOrderErrForm = SrchOrderErrForm.initData(); } /// HTTPレスポンスデータを反映する fromJson(String resData) { Map<String,dynamic> _resDataMap = jsonDecode(resData); //入出力データ用 if (_resDataMap["resForm"]==null) { sortItemName = ""; sortOrder = ""; updMode = ""; } else { sortItemName = _resDataMap["resForm"]["sortItemName"] ?? ""; sortOrder = _resDataMap["resForm"]["sortOrder"] ?? ""; updMode = _resDataMap["resForm"]["updMode"] ?? ""; } // プロパティ エラーメッセージ srchOrderErrForm.fromJson(resData); } /// HTTPレスポンスデータを作成する Map<String,dynamic> toJsonMap (String _mode, String _csrf, [int page=0]) { Map<String,dynamic> rtnMap = { 'sortItemName': sortItemName, 'sortOrder': sortOrder, 'updMode': updMode, }; return rtnMap; } /// 入出力データを、TextFormFieldに設定する forSrchOrderFormController( TextEditingController sortItemNameController, TextEditingController sortOrderController, TextEditingController updModeController, ) { sortItemNameController.text = sortItemName; sortOrderController.text = sortOrder; updModeController.text = updMode; } /// TextFormField値を、入出力データに設定する fromSrchOrderFormController( TextEditingController sortItemNameController, TextEditingController sortOrderController, TextEditingController updModeController, ) { sortItemName = sortItemNameController.text; sortOrder = sortOrderController.text; updMode = updModeController.text; } }
■修正後のsrch_order_err_form.dart
import 'dart:convert'; /// ユーザー情報画面プロパティ エラーメッセージ用Form class SrchOrderErrForm { //プロパティ エラーメッセージ用 late List<String> sortItemNameErr; late List<String> sortOrderErr; late List<String> updModeErr; /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「クラス名(this.name,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している SrchOrderErrForm.initData() { //エラーメッセージ用 sortItemNameErr = <String>[]; sortOrderErr = <String>[]; updModeErr = <String>[]; } /// HTTPレスポンスデータを反映する fromJson(String resData) { Map<String,dynamic> _resDataMap = jsonDecode(resData); //エラーメッセージ用 if (_resDataMap["resErrorData"]==null) { sortItemNameErr = <String>[]; sortOrderErr = <String>[]; updModeErr = <String>[]; } else { sortItemNameErr = _resDataMap["resErrorData"]["sortItemName"]!=null?_resDataMap["resErrorData"]["sortItemName"].cast<String>():<String>[]; sortOrderErr = _resDataMap["resErrorData"]["sortOrder"]!=null?_resDataMap["resErrorData"]["sortOrder"].cast<String>():<String>[]; updModeErr = _resDataMap["resErrorData"]["updMode"]!=null?_resDataMap["resErrorData"]["updMode"].cast<String>():<String>[]; } } }
②上記のつづき。
フロントFlutter側のsrch_order_form_in_msg_form.dartも同じように、SrchOrderForm(SrchOrderErrFormを包含する)、MessageFormを包含するように修正する。
■修正後のsrch_order_form_in_msg_form.dart
import 'dart:convert'; import 'package:flutter_app/form/comm/message_form.dart'; import 'package:flutter_app/form/comm/srch_order_form.dart'; /// 共通・検索ソート順Form。(MessageFormクラスを包含している) class SrchOrderFormInMsgForm { // 共通・検索ソート順Form late SrchOrderForm srchOrderForm; // 共通・検索ソート順Form // 共通・メッセージ late MessageForm messageForm; // 共通・メッセージ /// コンストラクタ // Dartでは「コンストラクタ名.任意名称」で複数のコンストラクタを定義する // 「クラス名(this.sortItemName,・・・);」コンストラクタはいらないので, // これだけにする。 // 初期値のクラスを作成している SrchOrderFormInMsgForm.initData() { // 共通・検索ソート順Form srchOrderForm = SrchOrderForm.initData(); // 共通・メッセージ messageForm = MessageForm.initData(); } /// HTTPレスポンスデータを反映する fromJson(String resData) { // 共通・検索ソート順Form srchOrderForm.fromJson(resData); // 共通・メッセージ messageForm.fromJson(resData); } /// HTTPレスポンスデータを作成する Map<String,dynamic> toJsonMap (String _mode, String _csrf, [int page=0]) { Map<String,dynamic> rtnMap = { 'srchOrderForm': srchOrderForm.toJsonMap(_mode, _csrf, page), 'formComm': messageForm.toJsonMap(_mode, _csrf, page), }; return rtnMap; } /// http.postのbodyで使用するJsonデータを返却する String toJson(String _mode, String _csrf, [int page=1]) { return json.encode(toJsonMap(_mode, _csrf, page)); } }
■2022/06/15に、勉強した成果:『Flutter_JavaSpringプログラム自動作成◎自動生成ツール』をVectorに載せました。Zenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
・Vector
www.vector.co.jp
・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev