OOP

  • 虽然框架推荐使用的函数式的编程方式,也提供面向对象式的编程方式的支持。
    • ViewPart
      • 需要复写 build 函数。
      • 需要的 state,dispatch,viewService 的参数,已经成为了对象的字段可以直接使用。
      • 它是@immutable 的,所以不应该也不需要在内部定义可变字段。
    • EffectPart
      • 需要复写 createMap 函数。
      • 需要的 Context 已经被打平,作为了对象的字段可以直接使用。
      • 可以定义字段,它的可见性也仅限于自身。
      • 它必须配合 higherEffect 一起使用。
  • 示例代码
  1. class MessageView extends ViewPart<MessageState> {
  2. @override
  3. Widget build() {
  4. return Column(children: [
  5. viewService.buildComponent('profile'),
  6. InkWell(
  7. child: Text('$message'),
  8. onTap: () => dispatch(const Action('onShare')),
  9. ),
  10. ]);
  11. }
  12. }
  13. class MessageEffect extends EffectPart<MessageState> {
  14. ///we could put some Non-UI fields here.
  15. @override
  16. Map<Object, OnAction> createMap() {
  17. return <Object, OnAction>{
  18. Lifecycle.initState: _initState,
  19. 'onShare': _onShare,
  20. };
  21. }
  22. void _initState(Action action) {
  23. //do something on initState
  24. }
  25. void _onShare(Action action) async {
  26. //do something on onShare
  27. await Future<void>.delayed(Duration(milliseconds: 1000));
  28. dispatch(const Action('shared'));
  29. }
  30. }
  31. class MessageComponent extends Component<MessageState> {
  32. MessageComponent(): super(
  33. view: MessageView().asView(),
  34. higherEffect: higherEffect(() => MessageEffect()),
  35. );
  36. }