Флаттер .listen вызывается несколько раз - PullRequest
0 голосов
/ 13 апреля 2020

Я использую https://pub.dev/packages/flutter_uploader в моем проекте.

хранилище

try {
      final result = await InternetAddress.lookup('google.com');
      if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
        final taskId = await uploader.enqueue(
            url:
                'https://xxxx',
            files: files,
            data: {
             ....
            },
            method: UploadMethod.POST,
            showNotification: true,
            tag: title);

        final subscription = uploader.result.listen((result) async {
          print("response " + result.response);
        }, onError: (ex, stacktrace) {
          print(ex.toString());
        });
      }
    } catch (e) {
      ...
    }
  }

При первом вызове uploader.result.listen будет печататься только один раз. Но если я вызову этот метод снова, uploader.result.listen вызовет дважды. Почему?

Редактировать

Я изменил свой код на этот

PageA

  StreamSubscription<UploadTaskResponse> _subscription;
  FlutterUploader uploader = FlutterUploader();

  @override
  void initState() {
    super.initState();

    _subscription = uploader.result.listen(
      (result) {

         // insert result to database
           .....
      },
      onError: (ex, stacktrace) {
        // ... code to handle error
      },
    );

  }

  void dispose() {
    super.dispose();
    _subscription.cancel();
    _defectBloc.dispose();
  }

На странице A он имеет плавающую кнопку Action. При нажатии кнопки с плавающим действием откроется страница B. Я передам параметр uploader в PageB и bloc, чтобы он мог прослушивать uploader. Данные можно вставить в локальную базу данных, если я на странице инициализации. Как я могу позволить вставке работать, если я выйду из приложения?

1 Ответ

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

Когда вы звоните uploader.result.listen, он будет добавлять подписку каждый раз, если вы звоните так n раз, будет добавлена ​​подписка n.

Чтобы устранить проблему, необходимо отменить предыдущую подписку, используя cancel () или вы должны добавить подписку только один раз (в вашем initState и отменить в вашем методе dispose).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...