#flutter #enums #stream #bloc #sink
#flutter #перечисления #поток #блок #приемник
Вопрос:
Я новичок в Flutter и не уверен, что это правильный метод. Я следую руководству YouTube по созданию приложения для просмотра фильмов с использованием TMDB API и пытаюсь передать ‘GenreId’ из category.dart (комментарий ниже) в MovieBloc.dart. Возможно ли отправить ‘GenreId’? Если да, как я могу его передать? Если нет, то как лучше всего это сделать? Спасибо
category.dart
final movieBloc = MovieBloc();
setState(() {
selectedGenre = genre.id;
movieBloc.eventSink.add(MovieControlAction.byGenre); // send genreId through here??
});
movie_bloc.dart
import 'dart:async';
import 'package:flutter_api/Model/movie.dart';
import 'package:flutter_api/Service/api_service.dart';
enum MovieControlAction { fetch, delete, byGenre, }
class MovieBloc {
final service = ApiService();
final _stateStreamController = StreamController<List<Movie>>();
StreamSink<List<Movie>> get _movieSink => _stateStreamController.sink;
Stream<List<Movie>> get movieStream => _stateStreamController.stream;
final _eventStreamController = StreamController<MovieControlAction>();
StreamSink<MovieControlAction> get eventSink =>
_eventStreamController.sink; //input
Stream<MovieControlAction> get _eventStream =>
_eventStreamController.stream; //output
MovieBloc() {
_eventStream.listen((event) async {
if (event == MovieControlAction.fetch) {
try {
var movies = await service.getNowPlayingMovie();
if (movies != null) {
_movieSink.add(movies);
} else {
_movieSink.addError('Null');
}
} on Exception catch (e) {
print(e);
_movieSink.addError('Something went wrong');
}
} else if (event == MovieControlAction.byGenre) {
var moviesByGenre = await service.getMovieByGenre(genreId);
if (moviesByGenre != null) {
_movieSink.add(moviesByGenre);
} else {
_movieSink.addError('Null');
}
}
});
}
void dispose() {
_stateStreamController.close();
_eventStreamController.close();
}
}
Ответ №1:
Вы можете передать его в MovieBloc следующим образом:
final movieBloc = MovieBloc(genreId: genre.id);
А затем создайте конструктор в классе MovieBloc:
class MovieBloc {
final String genreId; // String, int, whatever type it is
MovieBloc({
required this.genreId,
});
}
Если вы хотите использовать реальный блок, вам следует расширить MovieBloc следующим образом:
class MovieBloc extends Bloc<MovieEvent, MovieState> {}
В настоящее время не похоже, что вы используете фактический шаблон блоков. Пожалуйста, ознакомьтесь с официальной документацией блока. Я обещаю — это очень полезно.