簡體   English   中英

在 Flutter 中使用 Provider Package 的運行時多態性

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM