流订阅在 flutter 应用程序中的 dart 中抛出错误?

stream subscription throwing an error in dart in flutter app?

我在 flutter 中使用 connectivity 插件来检查连接状态,但偶尔会遇到错误 PlatForm Exception(No active stream to cancel, null),即使我已经处理了 null 情况。我在 initState 订阅了流并在 dispose 状态

取消了订阅

我的代码看起来像这样。

    StreamSubscription streamConnectionStatus;
    ------------
    //remaining code
    ------------
    @override
    void initState() {
    getConnectionStatus();
  }

getConnectionStatus() async {
    streamConnectionStatus = new Connectivity()
        .onConnectivityChanged
        .listen((ConnectivityResult result) {
      // Got a new connectivity status!

      if (result == ConnectivityResult.mobile ||
          result == ConnectivityResult.wifi) {
        setState(() {
          boolHasConnection = true;
        });
      } else {
        setState(() {
          boolHasConnection = false;
        });
      }
    });

@override
  void dispose() {
    try {
      streamConnectionStatus?.cancel();
    } catch (exception, stackTrace) {
      print(exception.toString());
      updateError(exception.toString(), stackTrace);
    } finally {
      super.dispose();
    }
  }

这真的让我发疯,但我猜我遗漏了什么或者我必须更改代码。

非常感谢, 鲯鳅鱼

我认为您的 dispose 函数是在 getConnectionStatus 中定义的。 IDE 可能不会抛出错误,因为它仍然是一个有效的定义。只需将其从内部移除并确保它位于相应的 class 中。您的代码就像一个魅力。

示例:

class ConnectivityExample extends StatefulWidget {
  @override
  _ConnectivityExampleState createState() => new _ConnectivityExampleState();
}

class _ConnectivityExampleState extends State<ConnectivityExample> {
  StreamSubscription streamConnectionStatus;

  bool boolHasConnection;

  @override
  void initState() {
    getConnectionStatus();
  }

  Future<Null> getConnectionStatus() async {
    streamConnectionStatus = new Connectivity()
        .onConnectivityChanged
        .listen((ConnectivityResult result) {
      debugPrint(result.toString());

      if (result == ConnectivityResult.mobile ||
          result == ConnectivityResult.wifi) {
        setState(() {
          boolHasConnection = true;
        });
      } else {
        setState(() {
          boolHasConnection = false;
        });
      }
    });
  }

  // dispose function inside class
  @override
  void dispose() {
    try {
      streamConnectionStatus?.cancel();
    } catch (exception, stackTrace) {
      print(exception.toString());
    } finally {
      super.dispose();
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      color: Colors.white,
      alignment: Alignment.center,
      child: new Text(boolHasConnection.toString()),
    );
  }
}

希望对您有所帮助!

我遇到了类似的问题。这就是帮助我的。

我已经在同一小部件​​树的不同小部件中订阅了连接插件公开的流。我从子窗口小部件中删除了订阅,仅在父窗口中保留了订阅,并将连接状态从父窗口传递给子窗口。

通过这样做,我的代码变得更加清晰,并且流订阅仅在一个地方维护/处理。然后就没遇到这个问题了