Flutter 颤振Riverpod设计模式(禁止垃圾收集)
我已经编写了一个Swift/IOS包,将我的所有社交/联邦/Firebase身份验证样板(SDK和UI)外部化并标准化。我把它当作一个学习练习,让它飘动起来。。。但也允许通过配置传入自定义UI 由于我是新来的颤振和Riverpod,我恐怕我犯了一些严重的错误&我想在深入之前从你们专家那里得到反馈 该包名为“社交登录助手”或SLH,这是我想要的公共API: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) {
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被处置时,提供者被处置。因此,您的提供者的作用域为其父提供者作用域。