[英]Runtime polymorphism by using Provider Package in Flutter
如何通过在Flutter中使用Provider Package 来应用运行时多态性? 我有一个高级用例。 我的应用程序有一个“查看演示”按钮,可将用户带入应用程序,他可以查看所有带有一些虚拟数据的屏幕。 这有助于用户在创建帐户之前查看整个应用程序。
我正在使用存储库模式并有一个 Repo 抽象 class 并由FirebaseRepo用实际数据和MockRepo用虚拟数据实现。 我需要在整个应用程序中提供 Repository 实例。
当用户单击登录按钮时,Repository 应与FirebaseRepo交换,当用户单击“查看演示”按钮时,Repository 实例应与MockRepo交换。 因此需要使用Provider package 在运行时提供和交换依赖项。 如何做到这一点?
虽然在应用程序之外,我应该能够通过简单地使用Provider.of<Repository>(context)
而不是Provider.of<RepositoryModel>(context).getRepository()
来访问存储库,这样我就可以简单地使用Provider.of<Repository>(context).getUser()
请尝试以下简单的解决方案。
abstract class Repository {}
class FirebaseRepo extends Repository {}
class MockRepo extends Repository {}
// on login
Provider<FirebaseRepo>(
create: (_) => FirebaseRepo(),
dispose: (_, bloc) => bloc.dispose(),
child: MainPage<FirebaseRepo>(),
)
// on mock
Provider<MockRepo>(
create: (_) => MockRepo(),
dispose: (_, bloc) => bloc.dispose(),
child: MainPage<MockRepo>(),
)
class MainPage<T extends Repository> extends StatefullWidget {
_MainPageState createState() => _MainPageState<T extends Repository>();
}
class _MainPageState<T extends Repository> extends State<MainPage> {
/// BLoC of type T.
T bloc;
@override
void initState() {
super.initState();
bloc = Provider.of<T>(context, listen: false);
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.