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