首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dart泛型编程

Dart泛型编程
EN

Stack Overflow用户
提问于 2021-11-04 15:49:36
回答 1查看 46关注 0票数 0

我正在尝试为Flutter项目实现一个块模式,我的代码是大量可重用的,所以我决定使用泛型编程来实现它。

首先,我定义了事件类:

代码语言:javascript
复制
import 'package:flutter_bloc/flutter_bloc.dart';

abstract class AbstractSelectionEvent<T> {
  final T obj;

  AbstractSelectionEvent(this.obj);
}

class SelectedEvent<T> extends AbstractSelectionEvent<T> {
  SelectedEvent(T obj) : super(obj);
}

class UnselectedEvent<T> extends AbstractSelectionEvent<T> {
  UnselectedEvent(T obj) : super(obj);
}

class ChangeSelectionEvent<T> extends AbstractSelectionEvent<T> {
  ChangeSelectionEvent(T obj) : super(obj);
}

然后是状态类:

代码语言:javascript
复制
abstract class AbstractSelectionState<T> {
  final Set<T> selected;

  AbstractSelectionState(this.selected);

  AbstractSelectionState<T> select(T obj);

  AbstractSelectionState<T> unselect(T obj);

  AbstractSelectionState<T> changeSelect(T obj);

  AbstractSelectionState<T> reset(T obj);
}

class SelectedState<T> extends AbstractSelectionState<T> {
  SelectedState(Set<T> selected) : super(selected);

  SelectedState<T> select(T obj) => SelectedState<T>(selected..add(obj));

  SelectedState<T> unselect(T obj) => SelectedState<T>(selected..remove(obj));

  SelectedState<T> changeSelect(T obj) =>
      selected.contains(obj) ? unselect(obj) : select(obj);

  SelectedState<T> reset(T obj) => SelectedState<T>(<T>{});
}

最后,当我编写BLOC类时,我遇到了一些麻烦。

代码语言:javascript
复制
abstract class SelectionBloc<
    T,
    E extends AbstractSelectionEvent<T>,
    S extends AbstractSelectionState<T>
  > extends Bloc<E, S> {
  SelectionBloc(S initialState) : super(initialState) {
    
    // ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ The first error
    on<SelectedEvent<T>>((event, emit) {
      
      //   ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ The second error
      emit(state.select(event.obj));
      
    });
    
  }
}

第一个错误是

代码语言:javascript
复制
'SelectedEvent<T>' doesn't conform to the bound 'E' of the type parameter 'E'.


Try using a type that is or is a subclass of 'E'.

第二个错误:

代码语言:javascript
复制
The argument type 'AbstractSelectionState<T>' can't be assigned to the parameter type 'S'.

对于第二个错误,我知道selectunselectchangeSelectreset函数返回AbstractSelectionState<T>

SelectionBloc期望emit函数的状态为S,它是AbstractSelectionState<T>的子类。

但是从另一个角度来看,AbstractSelectionState<T>类是抽象的,这意味着函数的返回值必须是AbstractSelectionState<T>子类的实例。

这个问题可以解决吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-05 11:24:33

这应该是可行的:

代码语言:javascript
复制
abstract class SelectionBloc<T>
    extends Bloc<AbstractSelectionEvent<T>, AbstractSelectionState<T>> {

  SelectionBloc(AbstractSelectionState<T> initialState) : super(initialState) {
    
    on<AbstractSelectionEvent<T>>((
      event,
      emit,
    ) {
      emit(state.select(event.obj));
    });
    
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69842049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档