Dart和Flutter中具有强类型属性的匿名对象

3

我在使用redux和flutter_redux包的Dart代码中使用以下代码。一切都运行良好,但是如你所见,我必须使用以下语法来调用适当的操作。

callback['onIncrement'](34) 

它能够工作,但是很丑陋。我该如何改进它以使其更像这样:

callback.onIncrement(34)

这里是代码:

StoreConnector<AppState,Map<String,Function>>(
    converter: (store) {
      return {
        'onIncrement': (value) => store.dispatch(IncrementAction(value)), 
        'onDecrement': () => store.dispatch(Actions.decrement)
      };
    },
    builder: (context, callback) {
      return Column(
        children: <Widget>[
          FlatButton(
          child: Text('Increment Counter', style: TextStyle(color: Colors.white)),
          color: Colors.orange, 
          onPressed: () => callback['onIncrement'](1)

更新:

现在我正在使用枚举,并且效果有所提升:

StoreConnector<AppState,Map<Actions,Function>>(
        converter: (store) {
          return {
            Actions.increment: (value) => store.dispatch(IncrementAction(value)), 
            Actions.decrement: () => store.dispatch(Actions.decrement)
          };
        },
        builder: (context, callback) {
          return Column(
            children: <Widget>[
              FlatButton(
              child: Text('Increment Counter', style: TextStyle(color: Colors.white)),
              color: Colors.orange, 
              onPressed: () => callback[Actions.increment](23)
2个回答

3
据我所知,在Dart中不可能实现这个。你应该使用ViewModel来代替:
StoreConnector<AppState, ViewModel>(
  converter: ViewModel.fromStore,
  builder: (context, viewModel) {
    return FlatButton( 
      onPressed: () => viewModel.onIncrement(1),
      ...
    );
  },
}

...

class ViewModel {
  final void Function(int) onIncrement;
  final void Function(int) onDecrement;

  ViewModel({@required this.onIncrement, @required this.onDecrement});

  factory ViewModel.fromStore(Store store) {
    return ViewModel(
      onIncrement: (value) => store.dispatch(IncrementAction(value)),
      onDecrement: (value) => store.dispatch(DecrementAction(value)),
    );
  }
}

0

对于 Dart >= 3.0.0

欢迎来到 Dart 3,现在您可以使用 Records 定义匿名类型:

StoreConnector(
  converter: (Store<int> store) {
    return (
      // TODO: call store.dispatch() to actually change the state
      counter: store.state,
      increment: () => store.state + 1,
      decrement: () => store.state - 1,
    );
  },
  builder: (context, converter) {
    converter.increment(); // is available
    converter.decrement(); // is available

    return Text('${converter.counter}');
  },
)

关于Dart中与TypeScript的匿名类型对象等效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接