【问题标题】:Flutter .listen called multiple timesFlutter .listen 被多次调用
【发布时间】:2020-04-13 18:30:06
【问题描述】:

我在我的项目中使用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 会调用两次。为什么?

编辑

我已经把我的代码改成了这个

页面A

  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,它有floatingActionButton。当点击浮动动作按钮时,它会打开页面B。我将uploader参数传递给PageB和bloc,这样它就可以监听uploader。如果我在初始化页面上,数据能够插入到本地数据库中。如果我退出应用程序,如何让插入也起作用?

【问题讨论】:

    标签: file flutter dart


    【解决方案1】:

    当你调用uploader.result.listen时,它每次都会添加一个订阅,如果你调用n次,就会添加n个订阅。

    要解决此问题,您需要使用 cancel() 方法取消之前的订阅,或者您只需添加一次订阅(在您的 initState 中并在您的 dispose 方法中取消)。

    【讨论】:

    • 我把它放在onError下面,但是监听器会停止工作。
    • @Hoo:你不应该把它放在下面。您已将该订阅作为实例变量以及何时调用此方法。检查订阅是否为空,如果不为空,则取消订阅并重新订阅。但我的建议是在你的代码中订阅一次,这是最干净的方式
    • 你能再看看我的帖子吗?谢谢。
    • 您有什么建议吗?
    • @Hoo 如果您的应用已关闭,您可能需要使用服务。检查此文档flutter.dev/docs/development/packages-and-plugins/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2021-03-05
    • 2020-06-08
    • 2010-10-24
    • 2011-10-18
    • 2020-10-19
    相关资源
    最近更新 更多