dart 如何在使用提供程序时利用接口?

ttvkxqim  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(120)

假设我有3个ChangeNotifierProviders“Auth 1”,“Auth 2”,“Auth 3”。我希望它们都实现login()、signup()和isAuthenticated()。
这样我就可以随时更换一个供应商。

//Interface
class IAuth {
 Future<void> signUp(String email, String password)=>throw UnimplementedError();
 Future<void> login(String email, String password) => throw UnimplementedError();
 Future<bool> isAuthenticted() => throw UnimplementedError();
 void logout() => throw UnimplementedError();
}

我可以定义
class Auth1 extends ChangeNotifier implements IAuth {...}
class Auth2 extends ChangeNotifier implements IAuth {...}
class Auth3 extends ChangeNotifier implements IAuth {...}
但是,我如何提供供应商,以这样的方式,我可以取代他们没有任何问题的未来?
ChangeNotifierProvider.value(value:Auth1())
过了一段时间,我可能想用Auth 2替换Auth 1,我还想知道这是否是一个微不足道的问题

qxsslcnc

qxsslcnc1#

在RiverPod中使用ProviderScope可能更容易。(RiverPod由Provider的作者编写,用于解决一系列新问题。

tpgth1q7

tpgth1q72#

我来晚了然而,我刚刚遇到了同样的问题,解决方案是创建一个扩展ChangeNotifier的抽象类,然后使用抽象类的实现创建Provider。

abstract class AbstractAuthProvider extends ChangeNotifier {
    int? _userId;
    int get userId => userId
}
    
class Auth1Provider extends ChangeNotifier implements AbstractAuthProvider {
  int? _userId;
  int get userId => userId
}

class Auth2Provider extends ChangeNotifier implements AbstractAuthProvider {
  int? _userId;
  int get userId => userId
}

class Auth3Provider extends ChangeNotifier implements AbstractAuthProvider {
  int? _userId;
  int get userId => userId
}
    
Provider<AbstractAuthProvider>(
    create: (_) => Auth1Provider(),
    child: Consumer<AbstractAuthProvider>(context, auth1Provider, child){
        final userId = Provider.of<AbstractAuthProvider>(context).userId;
        return Column(
            childrens: [
                Text(userId.toInt()) /// will print user id value from auth1 provider
                Container(
                  child: Provider<AbstractAuthProvider>(
                    create: (_) => Auth2Provider(),
                    child: Consumer<AbstractAuthProvider>(context, auth2Provider, child){
                      final userId2 = Provider.of<AbstractAuthProvider>(context).userId;
                      return Text(userId2.toInt()) // will print user id value from auth 2 provider
                      // it will always get the value of nearest provider
                    }
                  )
                )
            ]
        )
    }
)

相关问题