フロント側をFlutter、バックエンド側SpringBootの自動作成勉強中
8:30~10:30
朝PC立ち上げたら、DELLのノートPCにつないだスマホ実機から、MouseComputerのノートPC「http://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本も書きました。使ってみての感想や間違いの指定や、こうやったほうがいいとかの情報があればメールください。
・Zenn本(Flutter_JavaSpringプログラム自動作成)
zenn.dev