ログから、以下のことが確認できます。
-
ESP32側:
Parameters sent: PARAMS:120,25が出力されており、正しくパラメータが送信されています。
-
Flutter側:
Notification received: PARAMS:120,25が出力されており、正しく通知を受信しています。State updated: hourDivision=120, pumpOnPercentage=25が出力されており、パラメータが更新されています。
しかし、設定画面で hourDivision と pumpOnPercentage が更新されていないようです。この問題は、UIの再描画が正しく行われていないか、設定画面にパラメータが反映されていないことが原因と考えられます。
問題の原因と解決策
1. setState の呼び出し確認
hourDivision と pumpOnPercentage が更新された後に、setState が正しく呼び出されているか確認します。
修正例
characteristic.value.listen((value) {
String data = String.fromCharCodes(value);
print("Notification received: $data");
// PARAMS: で始まるデータを処理
if (data.startsWith("PARAMS:")) {
List<String> params = data.substring(7).split(",");
if (params.length == 2) {
setState(() {
hourDivision = int.tryParse(params[0]) ?? 60;
pumpOnPercentage = int.tryParse(params[1]) ?? 50;
});
print("Updated params: hourDivision=$hourDivision, pumpOnPercentage=$pumpOnPercentage");
}
}
});
2. 設定画面の更新確認
SettingsScreen で hourDivision と pumpOnPercentage が正しく表示されているか確認します。
デバッグコード例
void didUpdateWidget(SettingsScreen oldWidget) {
super.didUpdateWidget(oldWidget);
// パラメータが更新されたらUIを更新
if (widget.hourDivision != oldWidget.hourDivision) {
hourDivisionController.text = widget.hourDivision.toString();
print("hourDivision updated: ${widget.hourDivision}");
}
if (widget.pumpOnPercentage != oldWidget.pumpOnPercentage) {
pumpOnPercentageController.text = widget.pumpOnPercentage.toString();
print("pumpOnPercentage updated: ${widget.pumpOnPercentage}");
}
}
3. UIの再描画確認
hourDivision と pumpOnPercentage が更新された後に、UIが再描画されているか確認します。
デバッグコード例
setState(() {
hourDivision = int.tryParse(params[0]) ?? 60;
pumpOnPercentage = int.tryParse(params[1]) ?? 50;
print("State updated: hourDivision=$hourDivision, pumpOnPercentage=$pumpOnPercentage");
});
4. 設定画面の初期化確認
SettingsScreen の initState で hourDivision と pumpOnPercentage が正しく初期化されているか確認します。
デバッグコード例
void initState() {
super.initState();
hourDivisionController = TextEditingController(text: widget.hourDivision.toString());
pumpOnPercentageController = TextEditingController(text: widget.pumpOnPercentage.toString());
deviceNameController.text = widget.deviceConfig.name;
print("SettingsScreen initialized: hourDivision=${widget.hourDivision}, pumpOnPercentage=${widget.pumpOnPercentage}, deviceName=${widget.deviceConfig.name}");
}
5. 全体のデバッグフロー
以下のフローでデバッグを行います。
-
通知の受信確認:
Notification received: PARAMS:120,25が出力されているか確認します。
-
パラメータの更新確認:
Updated params: hourDivision=120, pumpOnPercentage=25が出力されているか確認します。
-
UIの再描画確認:
State updated: hourDivision=120, pumpOnPercentage=25が出力されているか確認します。
-
設定画面の更新確認:
hourDivision updated: 120やpumpOnPercentage updated: 25が出力されているか確認します。
6. デバッグの例
以下は、デバッグログの例です。
ESP32側のログ
Parameters sent: PARAMS:120,25
Flutter側のログ
Notification received: PARAMS:120,25
Updated params: hourDivision=120, pumpOnPercentage=25
State updated: hourDivision=120, pumpOnPercentage=25
hourDivision updated: 120
pumpOnPercentage updated: 25
7. 問題の特定と修正
上記のデバッグフローで問題が特定できたら、該当する部分を修正します。
- 通知の有効化:
characteristic.setNotifyValue(true)が正しく呼び出されているか確認します。
