получить данные по строке с blo c во флаттере - PullRequest
0 голосов
/ 30 апреля 2020

Я новичок во флаттере. И мне нужна помощь. У меня есть сервис. Я ищу данные по строке, которую я передаю из Ui.

Future<List<MyEntity>> getByString(String s) async {
    final CollectionReference _dbs = Firestore.instance.collection(_baseUrl);
    QuerySnapshot query =
        await _dbs.where("string", isEqualTo: s).getDocuments();
    List<MyEntity> products = query.documents
        .map((doc) => MyEntity.fromSnapshotJson(doc))
        .toList();
    return products;
  }

И у меня есть blo c. Я не знаю, как передать строку в Ui?.

class MyBloc extends BlocBase {

  final MyService _productService;

  MyBloc(this._productService) {
    listEvent.add(await _productService.getByString(// i should pass string from Ui));
  }

  final BehaviorSubject<List<MyEntity>> _controller =
      new BehaviorSubject<List<MovieEntity>>.seeded(List<MyEntity>());

  Observable<List<MovieEntity>> get listFlux => _controller.stream;
  Sink<List<MovieEntity>> get listEvent => _controller.sink;

  @override
  void dispose() {
    _controller?.close();
    super.dispose();
  }
}

Хорошая идея инициализировать сервис в конструкторе blo c? Не могли бы вы дать мне такой же совет?

1 Ответ

0 голосов
/ 30 апреля 2020

Вам нужно создать экземпляр блока blo c внутри своего класса обслуживания, если вы хотите приемник блока blo c и там добавить значения в приемник. Так, например, у вас есть класс обслуживания, который создает экземпляр блока в состоянии инициализации, и не забудьте закрыть его в dispose () следующим образом:

class Service extends StatefullWidget{
@override
  _ServiceState createState() => _ServiceState();
}

class _ServiceState extends State<Service> {
  MyBloc _myBloc;

  @override
  void initState() {
    _myBloc = MyBloc();
    super.initState();
  }

 @override
  void dispose() {
    _myBloc?.close();
    super.dispose();
  }

Future<List<MyEntity>> getByString(String s) async {
    final CollectionReference _dbs = Firestore.instance.collection(_baseUrl);
    QuerySnapshot query =
        await _dbs.where("string", isEqualTo: s).getDocuments();
    List<MyEntity> products = query.documents
        .map((doc) => MyEntity.fromSnapshotJson(doc))
        .toList();
    return products;
  }

Теперь в классе Service везде, где вы хотите передать строку, просто вызовите

List<MyEntity> products = await getByString("search string");
_myBloc.listEvent.add(products);

и просто измените код MyBlo c, так как он не требует обслуживания в своем конструкторе, например:

class MyBloc extends BlocBase {

  final BehaviorSubject<List<MyEntity>> _controller =
      new BehaviorSubject<List<MovieEntity>>.seeded(List<MyEntity>());

  Observable<List<MovieEntity>> get listFlux => _controller.stream;
  Sink<List<MovieEntity>> get listEvent => _controller.sink;

  @override
  void dispose() {
    _controller?.close();
    super.dispose();
  }
}
...