Я прямо здесь реализовал страницу поиска с шаблоном блока. Но я не знаю, где я могу передать значение поиска в блоке. Я думаю, что должно случиться так, что значение поиска должно быть передано событию, и в соответствии с результатами поиска состояние поиска должно быть изменено, но я не уверен, как это сделать.
search_bloc.dart:
class SearchBloc extends Bloc<SearchEvent, SearchState> {
static final SearchBloc _searchBlocSingleton = SearchBloc._internal();
//Search Query variables
final searchController = StreamController<String>();
Function(String) get inSearch => searchController.sink.add;
Stream<String> get outSearch => searchController.stream;
factory SearchBloc() {
return _searchBlocSingleton;
}
SearchBloc._internal();
@override
SearchState get initialState => UnSearchState();
@override
Stream<SearchState> mapEventToState(SearchEvent event) async* {
try {
yield UnSearchState();
yield await event.applyAsync(currentState: currentState, bloc: this);
} catch (_, stacktrace) {
print('$_ $stacktrace');
yield currentState;
}
}
@override
void dispose() {
super.dispose();
searchController.close();
}
}
search_event.dart
@immutable
abstract class SearchEvent extends Equatable {
SearchEvent([List props = const []]) : super(props);
Future<SearchState> applyAsync({SearchState currentState, SearchBloc bloc});
}
class LoadSearchEvent extends SearchEvent {
@override
String toString() => 'LoadSearchEvent';
@override
Future<SearchState> applyAsync(
{SearchState currentState, SearchBloc bloc}) async {
try {
await Future.delayed(Duration(seconds: 1));
return InSearchState();
} catch (_, stacktrace) {
print('$_ $stacktrace');
return ErrorSearchState(_.toString());
}
}
}
search_state.dart
import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';
@immutable
abstract class SearchState extends Equatable {
SearchState([List props = const []]) : super(props);
SearchState getStateCopy();
}
class UnSearchState extends SearchState {
@override
String toString() => "UnSearchState";
@override
SearchState getStateCopy() {
return UnSearchState();
}
}
class InSearchState extends SearchState {
@override
String toString() => "InSearchState";
@override
SearchState getStateCopy() {
return InSearchState();
}
}
class ProcessedSearchState extends SearchState {
@override
String toString() => "ProcessedSearchState";
@override
SearchState getStateCopy() {
return ProcessedSearchState();
}
}
class ErrorSearchState extends SearchState {
final String errorMessage;
ErrorSearchState(this.errorMessage);
@override
String toString() => "ErrorSearchState";
@override
SearchState getStateCopy() {
return ErrorSearchState(this.errorMessage);
}
}