フロント側をFlutter(スマホ)Thymeleaf(PC)、バックエンド側SpringBootの自動作成勉強中
23:44
①カレンダーの祝祭日に赤丸を付けるのだけど、昨日の日付取得ダイヤログの
// 祝祭日リスト Map<DateTime, List> _eventsList = { DateTime(2022, 1, 1, 0, 0): ['祝'], };
を'http://192.168.1.13:8080/js/holidays.xml'から取ってくるようにする。
補足:holidays.xmlはWEB側と同じものを見るようにする
例:holidays.xml
<holidaylist> <date>2022/01/01</date> <date>2022/01/10</date> <date>2022/02/11</date> ・・・ </holidaylist>
そしたら、dartのxmlパッケージが必要になったので、dependencies: xml: ^6.0.1したらエラーが出た。
Because every version of flutter_test from sdk depends on collection 1.15.0 and xml >=5.4.0 depends on collection ^1.16.0, flutter_test from sdk is incompatible with xml >=5.4.0. So, because flutter_app depends on both xml ^6.0.1 and flutter_test from sdk, version solving failed. pub get failed (1; So, because flutter_app depends on both xml ^6.0.1 and flutter_test from sdk, version solving failed.)
これは、dependencies: xml: ^5.0.1にすることでOKになった。
さらに、xmlパッケージは
Dart SDKのバージョンを2.16.0以上じゃないとダメとのことで、
https://docs.flutter.dev/get-started/install/windowsから最新を落として、今までのC:\src\flutterをバックアップしといて、C:\src\flutterに上書きした。
これにより、studio64のFile→Settings→Lamguages&Frameworks→DartのVersionが2.16.2になる。
これで、xmlが使えるようになった。
②カレンダーの祝祭日に赤丸を付けをとりあえずコーディングして、実機とつなげて実行したらエラーが出た。
https://kotlinlang.org/docs/gradle.html#plugin-and-versionsを見て、 C:\Users\ueki_\AndroidStudioProjects\flutter_app\android\build.gradleのext.kotlin_version='<最新バージョン>'にしないとだめらしい。
┌─ Flutter Fix ────────────────────────────────────────────────────────────────────────────────┐ │ [!] Your project requires a newer version of the Kotlin Gradle plugin. │ │ Find the latest version on https://kotlinlang.org/docs/gradle.html#plugin-and-versions, then │ │ update C:\Users\ueki_\AndroidStudioProjects\flutter_app\android\build.gradle: │ │ ext.kotlin_version = '<latest-version>' │ └──────────────────────────────────────────────────────────────────────────────────────────────┘
https://kotlinlang.org/docs/gradle.html#plugin-and-versionsに書いてあるバージョンは、
plugins { kotlin("<...>") version "1.6.20" }
なので、ext.kotlin_version='1.6.20'にした。
そしたら、実機が動き出した。
5:12
①なかなか、うまくいかなかったがこれで動いた。これで、holidays.xmlを_eventsList に取り込めた。
int getHashCode(DateTime key) { return key.day * 1000000 + key.month * 10000 + key.year; } // TableCalendarでは、カレンダーに読み込むイベントをMapで定義した場合、 // LinkedHashMap使用が推奨されている。 final _events = LinkedHashMap<DateTime, List>( equals: isSameDay, hashCode: getHashCode, ); List getEventForDay(DateTime day) { return _events[day] ?? []; } // 祝祭日リスト Map<DateTime, List> _eventsList = { }; // 祝祭日XMLを読む final url = Uri.parse('http://192.168.1.13:8080/js/holidays.xml'); HttpClientRequest request = await HttpClient().getUrl(url); HttpClientResponse response = await request.close(); // 祝祭日XMLのdateエレメントのみ抽出する final stream = response.transform(utf8.decoder) .toXmlEvents() .selectSubtreeEvents((event) => event.name == 'date'); // _eventsListに祝祭日を登録する await stream.forEachEvent(onText: (event) => _eventsList.addAll( {DateTime(int.parse((event.text).substring(0,4)), int.parse((event.text).substring(5,7)), int.parse((event.text).substring(8,10))): ['祝']})); // _eventsListに登録した祝祭日を、eventsに登録する _events.addAll(_eventsList);
補足:なかなか手こずったのは、
int.parse((event.text).substring(8,10))
の部分を
iint.parse(event.text.substring(8,10))
のように、(event.text)のカッコを付けなかったら、なぜか以下エラーとなったから。
ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: RangeError (start): Invalid value: Not in inclusive range 0..7: 8
②こんな感じに「