#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. Может быть, вам стоит подумать о реструктуризации вашего класса блоков. Разделение вашего блока на несколько блоков было бы ответом на ваш вопрос.