问题描述
我仍然使用我的第一个基于Bloc的应用程序,添加了功能。之前,我使用bloc类存储了一些页面特定的数据,对于最后一个功能,现在我将大多数变量移到了其存储库中。我已经担心调用存储库的实例此后会丢失,现在证明是正确的。
是否存在适当,简单的方法来使实例持久化?
我知道继承的窗口小部件,但是,我还没有弄清楚如何实现此功能,不幸的是,我对此的question仍未得到答复。如果有人可以指出我的方向,那就太好了!
总的来说,我的想法是让api处理本地文件和在线数据,具有经常重复使用的数据(会话数据,呈现的数据等)的存储库以及整个集团内的帮助程序变量。因此,当用户界面请求数据时,集团会询问存储库,该存储库将返回存储在变量中的值或向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));