[英]Flutter Riverpod design pattern (inhibit garbage collection)
我編寫了一個 Swift/IOS 包來外部化和標准化我所有的社交/聯合/Firebase 身份驗證樣板(SDK 和 UI)。 我自己將其移植到 Flutter 作為學習練習……但也允許通過配置傳入自定義 UI。
由於我是 Flutter 和 Riverpod 的新手,恐怕我犯了一些嚴重的錯誤,希望在深入了解之前從各位專家那里得到反饋。
該軟件包稱為“社交登錄助手”或 SLH,這是我想要的公共 API:
runApp(
slh.authStateBuilder(
builder: (authStatus) {
switch (authStatus.stage) {
case SlhResultStage.initializing:
return SplashScreen();
case SlhResultStage.unauthenticated:
// using Riverpod and Nav 2.0
return slh.authFlowUi;
case SlhResultStage.authenticated:
return ExampleApp(appKey, authStatus, slh.logoutCallback);
case SlhResultStage.wantsAnnonOnlyFeatures:
return ExampleApp(appKey, null, slh.startAuthCallback);
case SlhResultStage.excessiveFailures: // restart the app
return TotalFailure();
}
},
),
);
從上面可以看出,根目錄下的 State/Stream builder 絕不能被垃圾收集或清除。 我不清楚 Riverpod 是否以及何時會處置我的提供者,或者 Dart 本身是否會收集必須保持不朽的物品。 我也不確定是使用 StreamProvider 還是 State 提供者?
正如你在下面看到的,我故意制造了一個內存泄漏(死鎖)來保護我。 我確定這是一種反模式,但作為新手,我不確定如何保證永生。
非常歡迎所有指導和明確的反饋。
class LivingAuthState extends StateNotifier<SlhResultStage> {
// create deadly embrace to prevent this from ever being collected
_Unpurgeable _up;
LivingAuthState() : super(SlhResultStage.initializing) {
//
final StreamProvider<SlhResultStage> rssp =
StreamProvider<SlhResultStage>((ref) {
return this.stream.asBroadcastStream();
});
_up = _Unpurgeable(this, rssp);
// how do I keep rssp from ever being collected??
}
StreamProvider<SlhResultStage> get authStatusStream => _up.rssp;
void logout() {
this.state = SlhResultStage.unauthenticated;
}
void restartLogin() {
this.state = SlhResultStage.unauthenticated;
}
}
class _Unpurgeable {
final LivingAuthState _aliveState;
final StreamProvider<SlhResultStage> rssp;
_Unpurgeable(this._aliveState, this.rssp);
}
我希望在 Riverpod 文檔中看到的一項改進是,在沒有主動偵聽器的情況下,提供者在進行自我處置/垃圾收集之前可以存活多久。
啊,看起來我可以子類化 AlwaysAliveProviderBase() 來實現相同的目標......我將對此進行試驗。
將您的提供程序 final 移到頂層。 Riverpod 提供者是頂級最終變量。
還要記住將您的應用程序包裝在 Riverpod 提供程序中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.