簡體   English   中英

Flutter Riverpod 設計模式(禁止垃圾回收)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM