Передать параметр в блочном шаблоне Flutter (контроллер потока)

#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> {}
 

В настоящее время не похоже, что вы используете фактический шаблон блоков. Пожалуйста, ознакомьтесь с официальной документацией блока. Я обещаю — это очень полезно.