簡體   English   中英

使用 bloc 保持存儲庫實例“活着”

[英]keeping repository instance "alive" with bloc

我仍然使用我的第一個基於 bloc 的應用程序,添加功能。 以前,我使用 bloc 類存儲了一些特定於頁面的數據,但對於最后一個功能,我現在將大多數變量移動到其存儲庫中。 我已經擔心調用存儲庫的實例會丟失,之后,現在證明是正確的。

有沒有一種適當、簡單的方法來使實例持久化?

我知道繼承的小部件,但是,我還沒有想出如何實現這一點,不幸的是,我對此的問題仍未得到解答。 如果有人能指出我的方向,那就太好了!

一般來說,我的想法是讓 api 處理本地文件和在線數據,存儲經常重用的數據(會話數據、呈現的數據等)和塊內的輔助變量。 因此,當 UI 請求數據時,塊會詢問存儲庫,該存儲庫將返回存儲在變量中的值或從 api 請求值。

這是,結構基本上是這樣的(希望我沒有遺漏任何重要的東西)

void main() async {
  final UserRepository userRepository = UserRepository(); // <===== userRepository initialized
  runApp(MyApp(userRepository: UserRepository()));
}

class MyApp extends StatelessWidget {
  MyApp({Key key, this.userRepository}) : assert(userRepository != null), super(key: key);
  final UserRepository userRepository;

  @override
  Widget build(BuildContext context) {
    return BlocProvider<UserBloc>(  <====== userBloc injection to top of widget tree 
      create: (_) => UserBloc(userRepository: userRepository)..add(AppStarted()),
      child: App(),
    );
  }
}
// =================================================== APP WITH ROUTES
class App extends StatelessWidget {
  App({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      routes: {
        '/': (_) => HomePage(),
        'feature 1': (_) => HomePage(),
      },
    );
  }
}
// =================================================== LANDING PAGE WITH MAIN MENU
class HomePage extends StatefulWidget {
  HomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage>  { 
  @override
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
    ]);
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(
        middle: Text('MathUup'),
      ),
      child: SafeArea(
        child: CupertinoButton(
          child: Text('Feature 1',
              onPressed: () => Navigator.pushNamed(context, 'feature 1'),
  ),)));
}}     
// =================================================== BLOC
class UserBloc extends Bloc<UserEvent, UserState> {
  UserBloc({this.userRepository}) : super(AppInitial());
  final UserRepository userRepository;
  ...
    
      final user = await userRepository.getActiveUserData(userId);
      final lastSessionData = await userRepository.getLastSession(userId);
  ...
}
// =================================================== REPOSITORY
class UserRepository {
  UserRepository();
  final UserApiClient achievementsApiClient = UserApiClient();
  final SessionsApiClient sessionsApiClient = SessionsApiClient();
  UserSession activeUserSession;
  User activeUserData;
  
  
  Future<String> getLastUserId() async {
    final lastUserId = await sessionsApiClient.getLastUserId();
    return lastUserId;
  }
  Future<UserSession> getActiveUser() async {
    if (activeUserSession == null) {
      activeUserSession = await sessionsApiClient.getLastUser();
    }
    return activeUserSession;
  }
}
  
  

這一行正在創建和初始化您的用戶存儲庫:

final UserRepository userRepository = UserRepository(); // <===== userRepository initialized

但是,這一行並沒有傳遞該存儲庫,而是創建了一個存儲庫,忽略了您剛剛初始化的存儲庫:

runApp(MyApp(userRepository: UserRepository()));

我認為您打算使用您已經擁有的變量:

runApp(MyApp(userRepository: userRepository));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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