Cloud Firestore を使うと時刻情報周りの Warning が出る時の対処方法

Page content

Flutter で Cloud Firestore をそのまま使うと時刻情報周りの Warning が出るので、その対処方法を紹介します。

このエントリーをはてなブックマークに追加

Warning 内容

2019/04/10現在、何も設定せず Flutter の Cloud Firestoreを使うと以下のような警告が出てきます。

iOS の場合

The behavior for system Date objects stored in Firestore is going to change AND YOUR APP MAY BREAK.
To hide this warning and ensure your app does not break, you need to add the following code to your app before calling any other Cloud Firestore methods:

let db = Firestore.firestore()
let settings = db.settings
settings.areTimestampsInSnapshotsEnabled = true
db.settings = settings

With this change, timestamps stored in Cloud Firestore will be read back as Firebase Timestamp objects instead of as system Date objects. So you will also need to update code expecting a Date to instead expect a Timestamp. For example:

// old:
let date: Date = documentSnapshot.get("created_at") as! Date
// new:
let timestamp: Timestamp = documentSnapshot.get("created_at") as! Timestamp
let date: Date = timestamp.dateValue()

Please audit all existing usages of Date when you enable the new behavior. In a future release, the behavior will be changed to the new behavior, so if you d<>

Android の場合

W/Firestore( 7877): (0.6.6-dev) [Firestore]: The behavior for java.util.Date objects stored in Firestore is going to change AND YOUR APP MAY BREAK.
W/Firestore( 7877): To hide this warning and ensure your app does not break, you need to add the following code to your app before calling any other Cloud Firestore methods:
W/Firestore( 7877):
W/Firestore( 7877): FirebaseFirestore firestore = FirebaseFirestore.getInstance();
W/Firestore( 7877): FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
W/Firestore( 7877):     .setTimestampsInSnapshotsEnabled(true)
W/Firestore( 7877):     .build();
W/Firestore( 7877): firestore.setFirestoreSettings(settings);
W/Firestore( 7877):
W/Firestore( 7877): With this change, timestamps stored in Cloud Firestore will be read back as com.google.firebase.Timestamp objects instead of as system java.util.Date objects. So you will also need to update code expecting a java.util.Date to instead expect a Timestamp. For example:
W/Firestore( 7877):
W/Firestore( 7877): // Old:
W/Firestore( 7877): java.util.Date date = snapshot.getDate("created_at");
W/Firestore( 7877): // New:
W/Firestore( 7877): Timestamp timestamp = snapshot.getTimestamp("created_at");
W/Firestore( 7877): java.util.Date date = timestamp.toDate();
W/Firestore( 7877):
W/Firestore( 7877): Please audit all existing usages of java.util.Date when you enable the new behavior. In a future release, the behavior will be changed to the new behavior, so if you do not follow these steps, YOUR APP MAY BREAK.

Warning 内容を見るとCloud Firestoreに保存した時刻情報の取り方が変わるようです。 Date型からTimestamp型に変わり、時刻の精度が上がるようです。

今はオプションで有効にするようになっていますが、将来的にTimestamp型に置き換わるので、今のうちに対応しておくべきです。

解決方法

これらの Warning は iOS/Android で起きているもので、Flutterの plugin でも追従する必要があるものです。 調べてみるとこのPRですでに解決していました。

cloud_firestore0.8.2+1以上にアップデートすることでtimestampsInSnapshotsEnabledを有効にすることができるようになりました。

以下のようにFirestoreインスタンスをtimestampsInSnapshotsEnabledを有効に設定することで Warning が消えます。

Firestore firestore = Firestore(app: app);
await firestore.settings(timestampsInSnapshotsEnabled: true);

このオプションを有効にするとTimestampsクラスになってしまので、有効にする場合は必ずTimestampsクラスを使うように修正してください。

参考 URL

このエントリーをはてなブックマークに追加