Флаттер редукс: StoreConnector против StoreProvider - PullRequest
1 голос
/ 25 марта 2020

Я использую 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?

1 Ответ

2 голосов
/ 26 марта 2020

StoreConnector дает вам больше контроля над виджетом, особенно когда вы не хотите его перестраивать. StoreConnector:

  • позволяет определить, изменился ли ViewModel (нужно ли перестраивать виджет), если вы используете distinct: true и переопределите hashCode и == в своем ViewModel ;
  • позволяет вообще пропустить перестройку виджета, быстро проверив некоторые параметры c store.state:

    StoreConnector (отличный: true, ignoreChange: (состояние) {
    return state.someVariable == theValueIDontCareAbout;}, ...),

    class MyViewModel {@override bool operator == (other) {return (other is MyViewModel) && (this.someVmVariable == other.someVmVariable) ; }

    @ переопределить int get hashCode {int result = 17; результат = 37 * результат + someVmVariable.hashCode; вернуть результат; }}

И еще несколько мелких элементов управления. Взгляните на документацию конструктора StoreConnector. Если несколько виджетов внутри хранилища sonnector совместно используют один и тот же ViewModel, естественно, что они будут такими. Однако, если возможно предотвратить их отторжение путем разделения их ViewModel s, вы можете использовать отдельные StoreConnector s.

...