Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振Riverpod设计模式(禁止垃圾收集)_Flutter_Firebase Authentication_Dart Pub_Riverpod - Fatal编程技术网

Flutter 颤振Riverpod设计模式(禁止垃圾收集)

Flutter 颤振Riverpod设计模式(禁止垃圾收集),flutter,firebase-authentication,dart-pub,riverpod,Flutter,Firebase Authentication,Dart Pub,Riverpod,我已经编写了一个Swift/IOS包,将我的所有社交/联邦/Firebase身份验证样板(SDK和UI)外部化并标准化。我把它当作一个学习练习,让它飘动起来。。。但也允许通过配置传入自定义UI 由于我是新来的颤振和Riverpod,我恐怕我犯了一些严重的错误&我想在深入之前从你们专家那里得到反馈 该包名为“社交登录助手”或SLH,这是我想要的公共API: runApp( slh.authStateBuilder( builder: (authStatus) {

我已经编写了一个Swift/IOS包,将我的所有社交/联邦/Firebase身份验证样板(SDK和UI)外部化并标准化。我把它当作一个学习练习,让它飘动起来。。。但也允许通过配置传入自定义UI

由于我是新来的颤振和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();
        }
      },
    ),
  );
从上面可以看到,根目录下的状态/流生成器决不能被垃圾收集或清除。我不清楚Riverpod是否以及何时处置我的提供者,或者Dart本身是否会收集必须保持不朽的对象。我也不确定是使用StreamProvider还是使用State provider

正如您在下面看到的,我创建了一个故意的内存泄漏(死锁)来保护我。我肯定这是一种反模式,但作为新手,我不知道如何保证不朽

欢迎提供所有指导和明确反馈

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);
}
class LivingAuthState扩展StateNotifier{
//创造致命的拥抱,以防止它被收集
_不可催促的;
LivingAuthState():超级(SlhResultStage.initialization){
//
最终流提供程序rssp=
StreamProvider((参考){
返回此.stream.asBroadcastStream();
});
_up=_不可催促(此,rssp);
//如何防止rssp被收集??
}
StreamProvider获取authStatusStream=>\u up.rssp;
作废注销(){
this.state=SlhResultStage.unauthenticated;
}
void restartLogin(){
this.state=SlhResultStage.unauthenticated;
}
}
类_不可催促{
最终居住许可证;
最终的rssp;
_不可催促的(本._aliveState,本.rssp);
}
我希望在Riverpod文档中看到的一个改进是,在没有活动侦听器的情况下,在提供者进行自我处置/垃圾收集之前,它可以活多久


啊,看起来我可以子类AlwaysAliveProviderBase()来实现相同的目标。。。我将对此进行试验。

将您的最终提供者移至顶级。Riverpod提供者是顶级最终变量


还记得在riverpod提供商中包装您的应用程序。

谢谢您的帮助!提供者通常是顶级的,但在这种情况下,我的提供者只有一个用例。。。要将其父StateNotifier转换为StreamProvider。。。这给了我数据,请参见上面的这一行:StreamProvider get authStatusStream=>\u up.rssp;在这种情况下,有什么理由更广泛地揭露它吗??本例中的包装是在slh.authFlowUi内部完成的,因为我无法确定我的主机环境是否将使用Riverpods,我不想强制这样做。请让我知道,如果这听起来像是一个错误。请参阅文档中的错误。根据文档,当ProviderScope小部件和它的ProviderContainer被处置时,提供者被处置。因此,您的提供者的作用域为其父提供者作用域。