kazpgmの日記

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

フロント側を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>

そしたら、dartxmlパッケージが必要になったので、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

②こんな感じに「2022/01/012022/01/10」が赤丸”祝”でマークされた。よかった。
f:id:kazpgm:20220417050343p:plain