使用viewmodel时,导航到新屏幕并传递redux存储状态
我需要在使用viewmodel时,导航到新屏幕并传递redux存储状态,redux,architecture,dart,flutter,flutter-redux,Redux,Architecture,Dart,Flutter,Flutter Redux,我需要在build函数中将redux存储状态从一个屏幕传递到另一个屏幕。 我的问题是,在build函数中,我有一个ViewModel变量,它没有对状态的引用 这是屏幕的代码: import ... class Menu extends StatefulWidget { @override _MenuState createState() => _MenuState(); } class _MenuState extends State<Menu> { @ove
build
函数中将redux存储状态从一个屏幕传递到另一个屏幕。我的问题是,在
build
函数中,我有一个ViewModel变量,它没有对状态的引用
这是屏幕的代码:
import ...
class Menu extends StatefulWidget {
@override
_MenuState createState() => _MenuState();
}
class _MenuState extends State<Menu> {
@override
Widget build(BuildContext context) {
return StoreConnector<AppState, ViewModelLogin>(
converter: (store) => ViewModelLogin.create(store),
builder: (context, ViewModelLogin viewModel) {
Widget _buildPage(isLoggedIn) {
if (isLoggedIn) {
return ListView(
children: <Widget>[
ListTile(
title: Text('Settings'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MySettingsScreen(), // <-- HERE I NEED TO PASS THE STATE TO MySettingsScreen
),
);
},
),
ListTile(
leading: Image.network(
viewModel.loginType == 'facebook'
? 'https://img.icons8.com/color/52/000000/facebook.png'
: 'https://image.flaticon.com/teams/slug/google.jpg'
,
width: 30.0,
),
title: Text('Exit'),
onTap: () {
viewModel.onLogout(viewModel.loginType);
}
),
],
);
} else {
return LoginScreen(appBar: false);
}
}
return _buildPage(viewModel.isLoggedIn);
},
);
}
}
导入。。。
类菜单扩展了StatefulWidget{
@凌驾
_MenuState createState()=>\u MenuState();
}
类_MenuState扩展状态{
@凌驾
小部件构建(构建上下文){
返回存储连接器(
转换器:(存储)=>ViewModelLogin.create(存储),
生成器:(上下文,ViewModelLogin viewModel){
小部件构建页面(isLoggedIn){
如果(isLoggedIn){
返回列表视图(
儿童:[
列表砖(
标题:文本(“设置”),
onTap:(){
导航器。推(
上下文
材料路线(
生成器:(上下文)=>MySettingsScreen(),//\u MySettingsScreenState();
}
类_MySettingsScreenState扩展状态{
@凌驾
void initState(){
super.initState();
_加载();
}
void\u load()异步{
最终url='url';
试一试{
http.Response res=wait http.get(url,标题:{
“接受”:“应用程序/json”,
“内容类型”:“应用程序/json”,
“授权”:“承载者”+/对于应用程序范围内状态的最常见用例,您可以在需要状态的任何屏幕中使用StoreConnector
。您已经在菜单类中使用了它,但您可以在MySettingsScreen
构建方法覆盖中类似地使用它
此外,您的视图模型是使用应用商店创建的,因此您的想法是,在您构建视图模型时,包括应用商店构建视图所需的所有信息。例如:
class MyViewModel {
String myInfo;
factory MyViewModel.create(Store<AppState> store) {
return MyViewModel(myInfo: store.state.myInfoState);
}
...
}
类MyViewModel{
字符串myInfo;
factory MyViewModel.create(商店){
返回MyViewModel(myInfo:store.state.myInfoState);
}
...
}
然后使用viewmodel中的信息:
@override
Widget build(BuildContext context) => StoreConnector<AppState, MyViewModel>(
converter: (Store<AppState> store) => MyViewModel.create(store),
builder: (BuildContext context, MyViewModel viewModel) {
return Text(viewModel.myInfo);
}
@覆盖
小部件构建(BuildContext上下文)=>StoreConnector(
转换器:(存储)=>MyViewModel.create(存储),
生成器:(BuildContext上下文,MyViewModel viewModel){
返回文本(viewModel.myInfo);
}
您可以使用相同的机制在viewModel中保留对存储的引用:
class MyViewModel {
Store<AppState> myStore;
factory MyViewModel.create(Store<AppState> store) {
return MyViewModel(myStore: store);
}
...
}
类MyViewModel{
存储myStore;
factory MyViewModel.create(商店){
返回MyViewModel(myStore:store);
}
...
}
这允许您在构建方法中直接使用它:
@override
Widget build(BuildContext context) => StoreConnector<AppState, MyViewModel>(
converter: (Store<AppState> store) => MyViewModel.create(store),
builder: (BuildContext context, MyViewModel viewModel) {
return Text(viewModel.myStore.state.myInfo);
}
@覆盖
小部件构建(BuildContext上下文)=>StoreConnector(
转换器:(存储)=>MyViewModel.create(存储),
生成器:(BuildContext上下文,MyViewModel viewModel){
返回文本(viewModel.myStore.state.myInfo);
}
请注意,如果您希望在视图模型和redux持久性之间保持逻辑分离,第一种模式可能更可取。当用户与视图交互时,我想知道ViewModel是否会通过向reducer发送操作来响应。ViewModel在以Redu为模型的Android应用程序中的事件处理中扮演什么角色x?有没有办法将store引用传递给函数并从那里更改redux store?我是Flatter和redux的初学者。请不要介意这是一个愚蠢的问题:C
@override
Widget build(BuildContext context) => StoreConnector<AppState, MyViewModel>(
converter: (Store<AppState> store) => MyViewModel.create(store),
builder: (BuildContext context, MyViewModel viewModel) {
return Text(viewModel.myStore.state.myInfo);
}