kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成@自動生成ツール作成中

18:39
①今日は、『自動作成できたFlutterプログラムでをスマホ実機で動かしたい。』をやっている。まずこんな感じでAndroidStudioに入れた。
まあ、この時点では動いてくれるという思いでいっぱいだった。けど、入れてみたら、コンパイルエラーがたくさんある。

自動作成後のAndroidStudioProjectsへの設定
1.既存のプロジェクト「flutter_app」があれば、
 AndroidStudioProjectsフォルダ(例:C:\Users\自ユーザー\AndroidStudioProjects\flutter_app)の
 flutter_appフォルダをどこかにバックアップする。
2.AndroidStudioを立ち上げる。
3.既存のプロジェクト「flutter_app」があれば、削除する。
 手順:File→Close Projectをクリック
   一覧が出てきます。
   消したいプロジェクトを右クリック→Remove from Recent Project(Delete)押下。
   AndroidStudioを終了し、AndroidStudioProjectsフォルダ
   (例:C:\Users\自ユーザー\AndroidStudioProjects\flutter_app)の削除を確認する。
4.AndroidStudioを立ち上げる。
5.新規Flutterプロジェクトとして、プロジェクト「flutter_app」を作成する。
 新規→新規Flutterプロジェクト」→Flutterをクリック
  一番左に位置する「Flutter Application」を選択して、右下に位置する「Next」
  ProjectName:flutter_app、プロジェクトタイプ:Application、組織:com.kaz01で、
  右下に位置する「Finish」押下。
  途中、FlutterのSDKの場所を聞かれるので、セットアップ「Flutterの環境構築(Windows)」時に
   「例:flutter_windows_2.8.1-stable.zip」を展開後置いた場所
   (例:C:\src\flutter\bin\flutter)を指定する。
   補足:展開後置いた場所が分からないときは、Flutterの環境構築が済んでいれば、
      DOSコマンドで「where.exe flutter」で表示されます。
6.プロジェクト「flutter_app」に、自動作成したもの
 (Flutter_JavaSpringプログラム作成ツール\作成例\作成先フォルダ\flutter_app)を置く。
 手順:
  ・ファイルエクスプローラーで、「Flutter_JavaSpringプログラム作成ツール\作成例\
   作成先フォルダ\flutter_app\lib」以下をすべて選択し、右クリック→コピー押下
   AndroidStudio画面・プロジェクト「flutter_app」・「flutter_app\lib」で
   右クリック→Paste→Copy画面が出るのでOK押下。
   途中、上書き確認が出るので、Overwrite押下する
  ・「Flutter_JavaSpringプログラム作成ツール\作成例\作成先フォルダ\flutter_app\pubspec.yaml」を選択しコピー
   プロジェクト「flutter_app」右クリック→Paste→Copy画面が出るのでOK押下。
   途中、上書き確認が出るので、Overwrite押下する
7.プロジェクト「flutter_app」・pubspec.yamlを選択し表示されたエディタの右上「Pub Get」を押下する。
  「Process finished with exit code 0」がMessege欄に表示される。
  これにより、PGMエラーは表示されなくなる。Warningは残るので気になるものがあれば修正してください。

コンパイルエラーがたくさんある。ので、一つ一つつぶしている。今日は、このへんまで。続きはあしたやろう。

■情報画面Form、検索画面Formのクラスにcupertino.dartのimportが必要
これ→import 'package:flutter/cupertino.dart';

■情報画面Form、検索画面FormのクラスのDateはDateTime?とする。
 ・dartにDateクラスはない。?をつけないとnullが設定できない。
  late Date insdtFrom; // 登録日時From
↓
  late DateTime? insdtFrom; // 登録日時From

■情報画面Form、検索画面FormのクラスのLongはintとする。
  late Long biztypeCd; // 業種ID
↓
  late int biztypeCd; // 業種ID

■検索画面Formのクラスにcomm_utils.dartのimportが必要
これ→import 'package:flutter_app/utils/comm_utils.dart';

■検索画面Formのクラス名の先頭を大文字にする
/// 商品情報検索画面Form
class shohinSrchForm {
↓
class ShohinSrchForm {

■エラーメッセージ用Form、検索画面Form中の、エラーメッセージ用Formクラス名の先頭を大文字にする
  // 初期値のクラスを作成している
  itemErrForm.initData()  {
↓
  ItemErrForm.initData()  {

  // プロパティ エラーメッセージ
  late shohinSrchErrForm shohinSrchErrForm; // プロパティ エラーメッセージ
↓
  late ShohinSrchErrForm shohinSrchErrForm; // プロパティ エラーメッセージ

    // プロパティ エラーメッセージ
    shohinSrchErrForm = shohinSrchErrForm.initData();
↓
    shohinSrchErrForm = ShohinSrchErrForm.initData();

■情報画面Form、検索画面Form中に「;」の無い文がある
  forShohinFormController(
      TextEditingController productsnameController
      ) {
    productsnameController.text = productsname
↓
    productsnameController.text = productsname;

  fromShohinFormController(
      TextEditingController productsnameController
      ) {
    productsnameController.text = productsname
↓
    productsnameController.text = productsname;

    item26Controller.text = item26
↓
    item26Controller.text = item26;

■情報画面Form、検索画面Form中の「int」項目はとString()が必要な場所がある
    item19Controller.text = item19;
↓
    item19Controller.text = item19.toString();

■CommUtilsクラスにurl_launch_page.dartのimportではなく、url_launcher.dartのimportが必要
import 'package:url_launcher/url_launch_page.dart';
↓
import 'package:url_launcher/url_launcher.dart';

■CommUtilsクラスのlaunchInWebViewOrVCメソッドのconstを削除する
        webViewConfiguration: const WebViewConfiguration(headers: headers)
↓
        webViewConfiguration: WebViewConfiguration(headers: headers)

■CommUtilsクラスのcreateLrgMidChangeメソッドのdbELEMENTSを削除する
    if (dbELEMENTS == null) {
      return dbELEMENTS;
    }
↓
削除

■common_util.dartのcreateLrgMidSmlChange2の変数名間違いと左側インデントを修正
	Map<String, String> data = {"fmElementNm":fmElementNm, "fmLrgKey":LrgValue,
	                        "fmMidKey":midValue, "fmMidSelKbn":fmMidSelKbn, 
↓
	  Map<String, String> data = {"fmElementNm":fmElementNm, "fmLrgKey":lrgValue,
	                        "fmMidKey":midValue, "fmMidSelKbn":midSelKbn, 

■home.dartのimmport
import 'affairs/gazo/gazo_register_amend.dart';
↓
削除

import 'form/gazo_form.dart';
↓
削除

各情報の情報画面Form、検索画面Formをimmportする
例:以下を追加
import 'form/shohin_form.dart';
import 'form/shohin_srch_form.dart';

各情報の情報一覧、情報登録更新をimmportする
例:以下を追加
import 'affairs/shohin/shohin_list.dart';
import 'affairs/shohin/shohin_register_amend.dart';

■home.dartの変数名間違い。各情報で間違っている
                        ShohinRegisterAmend(title: widget.title,
                            Shohinname: widget.Shohinname,
↓
                        ShohinRegisterAmend(title: widget.title,
                            username: widget.username,

■XXX_detail.dartの不要なimport削除や追加。
<<削除>>
import 'package:flutter_app/utils/elements.dart';
<<追加>>
import 'package:intl/intl.dart';

■XXX_detail.dartの変数名間違い。ここは、ログインユーザ名を渡しているので、usernameとするのが正しい。
  const ShohinDetail({Key? key, required this.title, required this.shohinname,
↓
  const ShohinDetail({Key? key, required this.title, required this.username,


■XXX_detail.dartの項目値が空白時の表示にconstを追記する
例:
          child:Text('商品CD : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),
↓
          child:const Text('商品CD : ',
            textAlign: TextAlign.left,
            overflow: TextOverflow.clip,
          ),

■XXX_detail.dartの明細表示の値を修正
例:
_shohinForm.products
↓
_shohinForm.resDetailMapForm["products"]
・・・
_shohinForm.biztypeCdObj
↓
_shohinForm.resDetailMapForm["biztypeCdObj"]
・・・
_shohinForm.biztypeCdObj.bizname
↓
_shohinForm.resDetailMapForm["biztypeCdObj"]["bizname"]

■XXX_detail.dartの明細表示の固定エレメント値を修正
例:
    if (_shohinForm.openkbn1Obj != null) {
_shohinForm.openkbn1Obj.openkbn1Name
↓
    if (_shohinForm.resDetailMapForm["openkbn1Name"] != "") {
_shohinForm.resDetailMapForm["openkbn1Name"]

■情報画面Formに、XXX_detail.dartで使うためresDetailMapFormを追加する
<<追加 start>>
  late Map<String,dynamic> resDetailMapForm; // 明細情報
<<追加 end>>
・・・
  UserSrchForm.initData() {
・・・
<<追加 start>>
  resDetailMapForm = {}; // 明細情報
<<追加 end>>
・・・
  fromJson(String resData) {
・・・
<<追加 start>>
    // 明細情報
    if (_resDataMap["resDetailMapForm"]==null) {
      resDetailMapForm = {};
    } else {
      resDetailMapForm = _resDataMap["resDetailMapForm"];
    }
<<追加 end>>

■Spring側にresDetailMapFormを追加する。さらに固定になっているresListForm作成を各情報様に修正する。
①flutter-spring-kaz01u_元ネタ削除後_最新\src\main\java\com\kaz01u\demo\response\ResData.javaを修正
	/**
	 * getResDataMapメソッド
	 * Flutter向けデータマップを返却する
	 * 
	 * @param messageSource メッセージソース
	 * @param formComm Flutter側formComm
	 * @param resFormName Flutter側resForm
	 * @param srchFormName Flutter側srchForm
	 * @param srchOrdeFormName Flutter側srchOrdeForm
<<追加 start>>
	 * @param resDetailMapFormName Flutter側明細情報
	 * @param resListFormName Flutter側一覧情報
<<追加 end>>
	 * @return Flutter向けデータマップ
	 */
<<修正前 start>>
	public Map<String, Object> getResDataMap(MessageSource messageSource, FormComm formComm, String resFormName, String srchFormName, String srchOrdeFormName) {
<<修正前 end>>
<<修正後 start>>
	public Map<String, Object> getResDataMap(MessageSource messageSource, FormComm formComm, String resFormName, String srchFormName, String srchOrdeFormName,
												String resDetailMapFormName, String resListFormName) {
<<修正後 end>>
・・・
<<修正前 start>>
		map.put("resListForm", modelMap==null || modelMap.get("users")==null?null:modelMap.get("users"));
<<修正前 end>>
<<修正後 start>>
		map.put("resDetailMapForm", ObjectUtils.isEmpty(resDetailMapFormName) || modelMap==null || modelMap.get(resDetailMapFormName)==null?null:modelMap.get(resDetailMapFormName));
		map.put("resListForm", ObjectUtils.isEmpty(resListFormName) || modelMap==null || modelMap.get(resListFormName)==null?null:modelMap.get(resListFormName));
<<修正後 end>>

②hinagata\java\controller\admincomm\02_00_TblCommController.txtを修正
	/**
	 * リターン共通処理(Flutter、PC・WEB共用)
	 * リターン共通処理
	 *
	 * @param url 遷移先
	 * @param model モデル
	 * @param result チェック結果
	 * @param flutterFlg true:Flutter用 false:PC・WEB用
<<追加 start>>
	 * @param formComm Flutter側formComm
<<追加 end>>
	 * @param resFormName レスポンスForm名
<<追加 start>>
	 * @param srchFormName Flutter側srchForm
	 * @param srchOrdeFormName Flutter側srchOrdeForm
	 * @param resDetailMapFormName Flutter側明細情報
	 * @param resListFormName Flutter側一覧情報
<<追加 end>>
<<削除 start>>
	 * @param page 検索以外の時のページ
<<削除 end>>
	 * @return Flutter用String:jsonデータ PC・WEB用 Map<String, Object>:遷移先
	 */
<<修正前 start>>
	protected Object returnComm(String url ,Model model,BindingResult result, boolean flutterFlg, FormComm formComm, String resFormName, String srchFormName, String srchOrdeFormName) {
<<修正前 end>>
<<修正後 start>>
	protected Object returnComm(String url ,Model model,BindingResult result, boolean flutterFlg, FormComm formComm, String resFormName, String srchFormName, String srchOrdeFormName,
								String resDetailMapFormName, String resListFormName) {
<<修正後 end>>
		if (flutterFlg) {
			ResData resData = new ResData(model, result);
<<修正前 start>>
	        return resData.getResDataMap(messageSource, formComm, resFormName, srchFormName, srchOrdeFormName);
<<修正前 end>>
<<修正後 start>>
	        return resData.getResDataMap(messageSource, formComm, resFormName, srchFormName, srchOrdeFormName, resDetailMapFormName, resListFormName);
<<修正後 end>>
		} else {
			return url;
		}
	}
・・・
<<修正 start>>
以降、全ての「return returnComm(・・・」の最後を「);」→「,"■{prg_name}■", "■{prg_name}■s");」に変更する
<<修正 end>>

■2022/06/15に、勉強した成果:『Flutter_JavaSpringプログラム自動作成◎自動生成ツール』をVectorに載せました。Zenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
Vector
www.vector.co.jp
・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev