Инициировать событие blo c во время изменения состояния, чтобы открыть модальное - PullRequest
0 голосов
/ 28 февраля 2020

Является ли хорошей практикой (или, по крайней мере, возможно) инициирование события во время изменения состояния в флаттере с помощью flutter_blo c? Как в:

if (state is SomeState) {
  _bloc.add(Event())
}

Мой сценарий использования в этом сценарии состоит в том, чтобы вызвать модал как реакцию на какое-то изменение состояния, однако каждый раз, когда я делаю это (пробовал с BlocListener и BlocBuilder), модал всегда запускается дважды, так как вам нужно закрыть 2 модала.

Я должен сделать это, потому что я делаю 2 вызова API, каждое событие вызывает один вызов PostEvent и, скажем, GetEvent, и я хочу, чтобы модальное окно открывалось только после второго готово Мне также было интересно, должен ли я выполнять оба вызова в одном и том же методе, но еще не проверял это.

После некоторого копания я обнаружил, что, хотя Событие было добавлено только один раз, Виджет восстанавливал 2 раз с тем же состоянием (например, GetFinished), показывая 2 модалы.

Любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2020

Если я правильно понял, я бы посоветовал вам сделать следующее:

1 - Сделайте так, чтобы ваш виджет statefull слушал blo c .stream, на initState (Не забудьте отменить подписку при утилизации)

2 - При прослушивании новых данных вы запускаете этот модальный

3 - После запроса вы вызываете метод _bloc.add() для запуска модального режима.

4 - Пример:

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('test')),
        body: BodyWidget(),
      ),
    );
  }
}

class BodyWidget extends StatefulWidget {
  @override
  BodyWidgetState createState() {
    return new BodyWidgetState();
  }
}

class BodyWidgetState extends State<BodyWidget> {
  StreamSubscription subscription;

  @override
  void initState(){
    super.initState();
    subscription = _bloc.yourStream$.listen((data) async {
      await showDialog(context: context);
    });
  }

  @override
  void dispose() {
    subscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

Как видите, я говорю только о потоке потока без использования какого-либо внешнего 3-го пакета.

Это должно работать правильно

...