4

我只使用了 Flutter_redux 几天,我想知道这之间有什么区别:

class BtnCustom extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final store = StoreProvider.of<AppState>(context);

    return FlatButton(
      onPressed: store.dispatch(MyCustomAction),
      child: Text(store.state.MyCustomTxt),
    );
  }
}

class BtnCustom extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StoreConnector<AppState, _ViewModel>(
      converter: (store) => _ViewModel(
          txt: store.state.MyCustomTxt,
          onPressed: store.dispatch(MyCustomAction)),
      builder: (BuildContext context, _ViewModel vm) {
        return FlatButton(
          onPressed: vm.onPressed,
          child: Text(vm.txt),
        );
      },
    );
  }
}

class _ViewModel {
  final String txt;
  final void Function() onPressed;

  _ViewModel({this.txt, this.onPressed});
}

?

第一个看起来很方便使用。我应该注意使用其中一种方法有什么优点或缺点吗?

根据文档,StoreConnector 将在其中重建小部件,因此:

  • 当您不需要重建小部件时,可以不使用 StoreConnector 吗?
  • 可以在 StoreConnector 中有多个小部件吗?
4

1 回答 1

7

StoreConnector让您可以更好地控制小部件,尤其是当您不想重建它时。StoreConnector

  • ViewModel如果您在distinct: true; hashCode_ _==ViewModel

  • 让您通过快速检查某些特定内容来完全跳过小部件重建store.state

     StoreConnector<AppState, MyViewModel>(
         distinct: true,
         ignoreChange: (state) {      
             return state.someVariable == theValueIDontCareAbout;
         },
         ...
     ),
    
     class MyViewModel{
         @override
         bool operator ==(other) {
              return (other is MyViewModel) && (this.someVmVariable == other.someVmVariable);
         }
    
         @override
         int get hashCode {
             int result = 17;
             result = 37 * result + someVmVariable.hashCode;
             return result;
         }
     }
    

还有一些更细粒度的控件。看一下StoreConnector构造函数的文档。如果存储连接器内的多个小部件共享相同的 ViewModel,那么自然而然地拥有它们。但是,如果可以通过分隔它们ViewModel的 s 来防止它们重新生成,则可以使用单独StoreConnector的 s。

于 2020-03-26T07:35:38.570 回答