kazpgmの日記

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

フロント側をFlutter、バックエンド側SpringBootの自動作成勉強中

8:30~10:30

朝PC立ち上げたら、DELLのノートPCにつないだスマホ実機から、MouseComputerのノートPChttp://192.168.1.13:8080/login」が動かなかった。なので、DELLのノートPCからpingしてみたら、pingが通らなかった。MouseComputerのノートPCを認識してくれない!

ので、MouseComputerのノートPCを192.168.1.13にアドレス固定、DELLのノートPCを192.168.1.8」アドレス固定にした。

これで、様子をみることにする。

10分ぐらいしてDELLのノートPCからhttp://192.168.1.13:8080/login」が動いた。が、つないだスマホ実機からは動かない。Http.post例外(SocketException: OS Error: No route to host, errno = 113, address = 192.168.1.13, port = XXXXX)が発生したまま。30分たっても同じなので、スマホ実機を再起動したが、同じ状態だ。いつになったら動くのだろう。と思っていたら、3分ぐらいすぎたら、動いた。・・・やっと開発に入れる。あれこれ、1時間たっているではないか。不思議がいっぱいだ。

10:30~13:00

Http.postで取得後画面データが書き換わるはずだけど、TextFormFieldが書き換わらなかった。ので、修正した。うまく表示されるようになった。

 ・initialValue、onChangedを使うのはやめて、TextEditingController())を使うようにした。

修正前抜粋

              child:Column(
children:<Widget>[TextFormField(
initialValue: _userForm.name,
decoration: const InputDecoration(

labelText: "名前",
hintText: '25文字以内',
),
onChanged: (String value) {
_userForm.name = value;
},
),

修正後抜粋

final TextEditingController _nameController = TextEditingController();
              child:Column(
children:<Widget>[TextFormField(
// initialValue: _userForm.name,
controller: _nameController,
decoration: const InputDecoration(

labelText: "名前",
hintText: '25文字以内',
),
// onChanged: (String value) {
// _userForm.name = value;
// },
),

TextFormField以外の、CheckboxListTile(チェックボックス)、RadioListTile(ラジオボタン)はHttp.postで取得後画面データが更新されているのでこんな考慮はいらない

補足:CheckboxListTile(チェックボックス

  child:Column(
children:<Widget>[Column(
// エレメントがnullということはないので、!(bang operator)を使用し、コンパイルエラーを取り除いた。
children: Elements.elements["LOGIN_TYPE"]!.map((e) =>

//チェックボックス
CheckboxListTile(

activeColor: Colors.orange,
title: const Text('ログイン権限'),
subtitle: Text(e[1]),
controlAffinity: ListTileControlAffinity.leading,
value: _userForm.rolesArray.contains(e[0]),
onChanged: (value) {

setState(() {
CommUtils.handleCheckbox(_userForm.rolesArray, e[0]);
});
}

)
).toList(),
),
Text(

// HTTPで返却されたエラーメッセージを表示する。(エラーなしはText=0にしている)
_userForm.rolesArrayErr.join("\n"),
textAlign: TextAlign.left,
overflow: TextOverflow.clip,
style: TextStyle(height:_userForm.rolesArrayErr==[]?0:1.2, fontSize: 12, fontWeight: FontWeight.normal, color: Colors.red),
),
],
),
),

13:00~

2月5日の日記に

⑤Flutter向けエラーメッセージは「for (FieldError error : result.getFieldErrors()) {」、「map.add(error.getField(), error.getDefaultMessage());」で編集した。項目名と、エラーメッセージのマップ。

 ・・・気持ち的にはエラーメッセージの{0}も値が入っていてくれると思っていたのだけど。入っていないので自分で入れるようになるかと思う。

と書いたが、エラーメッセージの{0}に値を入れる方法がわかった。

修正前

    private MultiValueMap<String, String> getAllErrors(BindingResult result) {
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        if (result == null || !result.hasErrors()) {
            return map;
        }

        for (FieldError error : result.getFieldErrors()) {
            map.add(error.getField(), error.getDefaultMessage());
        }
        return map;
    }    

修正後

コントローラーに

    @Autowired
    MessageSource messageSource;

して、

    private MultiValueMap<String, String> getAllErrors(MessageSource messageSource,
                                                BindingResult result) {
        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        if (result == null || !result.hasErrors()) {
            return map;
        }

        for (FieldError error : result.getFieldErrors()) {
            map.add(error.getField(), messageSource.getMessage(
                    error.getCode(),error.getArguments(), error.getDefaultMessage(), 
                    Locale.getDefault()));
        }
        return map;
    }    

これで、{0}に値が入った。

■2022/06/15に、Flutter_JavaSpringプログラム自動作成◎自動生成ツールをVectorに載せました。Zenn本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。

Vector
www.vector.co.jp

・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev