使用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);
  }