расширение расширенного класса или как вывести код из блока

#flutter #dart #bloc

Вопрос:

поскольку нельзя расширить расширение класса , например class MyBloc extends Bloc<MyEvent, MyState> , каков самый чистый способ получить некоторые функции из моего файла блока? Поскольку логика немного сложнее, я хотел бы получить некоторые дополнительные функции, как в

 @override
Stream<MyState> mapEventToState(MyEvent event) async* {
  yield* event.map(
    loadRequested: (e) => _mapLoadRequestedToState(),
    dataEntered: (e) => _mapDataEnteredToState(),
  );
}

Stream<LogicChainState> _mapLoadRequestedToState() async* {
  final dataRaw = loadData();
  final dataProc = initData(dataRaw);
  yield doSomeMore(dataProc);
}
 

Мне не нравится идея использования глобальных функций. Я мог бы создать класс

 class MyBlocUtils {
  MyData initData(MyData dataRaw) {
  ...
  }
  MyData doSomeMore(MyData dataProc) {
  ...
  }    
}
 

что все равно не так приятно, как использовать функцию, определенную в классе MyBloc .

Есть какие-нибудь советы?

Комментарии:

1. Почему вы хотите переместить их из класса блоков в другой класс?

2. просто чтобы сделать код немного более чистым. Сохраните основную структуру в файле класса блока и переместите некоторые служебные функции в некоторые служебные файлы. В настоящее время я довольно немного прокручиваю файл блока

3. Вы пробовали экспортировать свой код в миксин? Учебник здесь: medium.com/flutter-community/dart-what-are-mixins-3a72344011f3

Ответ №1:

Если все, что вы хотите, — это разделить свои методы на несколько файлов, но сохранить их в одном классе, вы можете использовать extension методы.

my_bloc.дротик

 part 'my_bloc_utils.dart';

class MyBloc extends Bloc<MyEvent, MyState> {
  Stream<LogicChainState> _mapLoadRequestedToState() async* {
    final dataRaw = loadData();
    final dataProc = initData(dataRaw);
    yield doSomeMore(dataProc);
  }
}
 

my_bloc_utils.дротик

 part of 'my_bloc.dart';

extension MyBlocUtils on MyBloc {
  @override
  Stream<MyState> mapEventToState(MyEvent event) async* {
    yield* event.map(
      loadRequested: (e) => _mapLoadRequestedToState(),
      dataEntered: (e) => _mapDataEnteredToState(),
    );
  }
}
 

Вы можете получить доступ к методам точно так же, как вы храните все в одном файле:

 import 'my_bloc.dart';

final myBloc = MyBloc();
final stream = myBloc.mapEventToState(MyEvent());
 

Комментарии:

1. очень интересная идея, но я думаю, что это не позволяет так, как мне хотелось бы, разделить класс. Моя цель-сделать логику немного более понятной и ускорить поиск кода. Таким образом, я хотел бы сохранить mapEventToState со всеми _mapLoadRequestedToState и т. Д. В основном классе блока и переместить помощники loadData, initData и т. Д. в файлы a или некоторых утилит

2. Может быть, вам стоит подумать о реструктуризации вашего класса блоков. Разделение вашего блока на несколько блоков было бы ответом на ваш вопрос.