🎯AsyncCacheのススメ(非同期処理の多重実行防止のための個人的ベタープラクティス)2023/09/14に公開2023/09/185件FlutterDarttechDiscussionあっぷる中谷2023/10/08 cacheStrategy = AsyncCache.ephemeral(); こちらあまり動きを理解できていないのですが、 UI側ではなくRiverpod等の実行元で final AsyncCache<dynamic> _postCache = AsyncCache.ephemeral(); Future<void> postHogehoge(String id) async { await _postCache.fetch(() async { state = const AsyncLoading(); state = await AsyncValue.guard(() => _hogeRepository.postHogehoge(id)); }); } しても同様の結果を得ることができるのでしょうか? 8rine232023/10/09あっぷる中谷さん、コメントしてくださりありがとうございます。 UI側ではなくRiverpod等の実行元でAsyncCache を使う場合のサンプルコードを作成しましたので、もしよければご覧いただけますと幸いです。 https://gist.github.com/TowaYamashita/94683cade8149b96aa5e814d75f99419 あっぷる中谷2023/10/09ありがとうございます! Riverpod内で宣言するとハッシュコードイコールじゃなくなってcacheが上手くいかない的な感じですかね?? なので宣言時にコンストラクタにAsyncCacheを渡してProviderがwatchされる事で一意のAsyncCacheになるから機能するという感じでしょうか?? あっぷる中谷2023/10/09頂いたサンプルコードを使ってコンストラクタ宣言したAsyncCache.ephemeral()をProvider内部で変数宣言に変えて実行したところ同様の結果を得たように見えました! 公式ドキュメントを見ると https://api.flutter.dev/flutter/async/AsyncCache/AsyncCache.ephemeral.html という風に書いてあったので ハッシュコードが違えどfinal宣言されたAsyncCache.ephemeral()に同一型の<T>リクエストが投げられる分には最大一回のみの実行が保証されるのかもしれません! 私の方でももう少し調査してみます🙇 8rine232023/10/10あっぷる中谷さん、返信ありがとうございます。 お考えの通り、AsyncCache.ephemeral() は キャッシュするかどうかをハッシュコードが等しいかではなく、同一型の<T>リクエストが投げられたかどうかで判断しているため、AsyncCache.ephemeral()をProvider内部で変数宣言に変えても問題ありません。 サンプルコードでは、コンストラクタ経由で AsyncCache.ephemeral() を渡していましたが、これは私の手癖なので気にしないでください。 返信を追加
あっぷる中谷2023/10/08 cacheStrategy = AsyncCache.ephemeral(); こちらあまり動きを理解できていないのですが、 UI側ではなくRiverpod等の実行元で final AsyncCache<dynamic> _postCache = AsyncCache.ephemeral(); Future<void> postHogehoge(String id) async { await _postCache.fetch(() async { state = const AsyncLoading(); state = await AsyncValue.guard(() => _hogeRepository.postHogehoge(id)); }); } しても同様の結果を得ることができるのでしょうか? 8rine232023/10/09あっぷる中谷さん、コメントしてくださりありがとうございます。 UI側ではなくRiverpod等の実行元でAsyncCache を使う場合のサンプルコードを作成しましたので、もしよければご覧いただけますと幸いです。 https://gist.github.com/TowaYamashita/94683cade8149b96aa5e814d75f99419 あっぷる中谷2023/10/09ありがとうございます! Riverpod内で宣言するとハッシュコードイコールじゃなくなってcacheが上手くいかない的な感じですかね?? なので宣言時にコンストラクタにAsyncCacheを渡してProviderがwatchされる事で一意のAsyncCacheになるから機能するという感じでしょうか?? あっぷる中谷2023/10/09頂いたサンプルコードを使ってコンストラクタ宣言したAsyncCache.ephemeral()をProvider内部で変数宣言に変えて実行したところ同様の結果を得たように見えました! 公式ドキュメントを見ると https://api.flutter.dev/flutter/async/AsyncCache/AsyncCache.ephemeral.html という風に書いてあったので ハッシュコードが違えどfinal宣言されたAsyncCache.ephemeral()に同一型の<T>リクエストが投げられる分には最大一回のみの実行が保証されるのかもしれません! 私の方でももう少し調査してみます🙇 8rine232023/10/10あっぷる中谷さん、返信ありがとうございます。 お考えの通り、AsyncCache.ephemeral() は キャッシュするかどうかをハッシュコードが等しいかではなく、同一型の<T>リクエストが投げられたかどうかで判断しているため、AsyncCache.ephemeral()をProvider内部で変数宣言に変えても問題ありません。 サンプルコードでは、コンストラクタ経由で AsyncCache.ephemeral() を渡していましたが、これは私の手癖なので気にしないでください。 返信を追加
8rine232023/10/09あっぷる中谷さん、コメントしてくださりありがとうございます。 UI側ではなくRiverpod等の実行元でAsyncCache を使う場合のサンプルコードを作成しましたので、もしよければご覧いただけますと幸いです。 https://gist.github.com/TowaYamashita/94683cade8149b96aa5e814d75f99419
あっぷる中谷2023/10/09ありがとうございます! Riverpod内で宣言するとハッシュコードイコールじゃなくなってcacheが上手くいかない的な感じですかね?? なので宣言時にコンストラクタにAsyncCacheを渡してProviderがwatchされる事で一意のAsyncCacheになるから機能するという感じでしょうか??
あっぷる中谷2023/10/09頂いたサンプルコードを使ってコンストラクタ宣言したAsyncCache.ephemeral()をProvider内部で変数宣言に変えて実行したところ同様の結果を得たように見えました! 公式ドキュメントを見ると https://api.flutter.dev/flutter/async/AsyncCache/AsyncCache.ephemeral.html という風に書いてあったので ハッシュコードが違えどfinal宣言されたAsyncCache.ephemeral()に同一型の<T>リクエストが投げられる分には最大一回のみの実行が保証されるのかもしれません! 私の方でももう少し調査してみます🙇
8rine232023/10/10あっぷる中谷さん、返信ありがとうございます。 お考えの通り、AsyncCache.ephemeral() は キャッシュするかどうかをハッシュコードが等しいかではなく、同一型の<T>リクエストが投げられたかどうかで判断しているため、AsyncCache.ephemeral()をProvider内部で変数宣言に変えても問題ありません。 サンプルコードでは、コンストラクタ経由で AsyncCache.ephemeral() を渡していましたが、これは私の手癖なので気にしないでください。
Discussion
こちらあまり動きを理解できていないのですが、
UI側ではなくRiverpod等の実行元で
しても同様の結果を得ることができるのでしょうか?
あっぷる中谷さん、コメントしてくださりありがとうございます。
UI側ではなくRiverpod等の実行元でAsyncCache を使う場合のサンプルコードを作成しましたので、もしよければご覧いただけますと幸いです。
ありがとうございます!
Riverpod内で宣言するとハッシュコードイコールじゃなくなってcacheが上手くいかない的な感じですかね??
なので宣言時にコンストラクタにAsyncCacheを渡してProviderがwatchされる事で一意のAsyncCacheになるから機能するという感じでしょうか??
頂いたサンプルコードを使ってコンストラクタ宣言したAsyncCache.ephemeral()をProvider内部で変数宣言に変えて実行したところ同様の結果を得たように見えました!
公式ドキュメントを見ると という風に書いてあったので
ハッシュコードが違えどfinal宣言されたAsyncCache.ephemeral()に同一型の<T>リクエストが投げられる分には最大一回のみの実行が保証されるのかもしれません!
私の方でももう少し調査してみます🙇
あっぷる中谷さん、返信ありがとうございます。
お考えの通り、AsyncCache.ephemeral() は キャッシュするかどうかをハッシュコードが等しいかではなく、同一型の<T>リクエストが投げられたかどうかで判断しているため、AsyncCache.ephemeral()をProvider内部で変数宣言に変えても問題ありません。
サンプルコードでは、コンストラクタ経由で AsyncCache.ephemeral() を渡していましたが、これは私の手癖なので気にしないでください。