【问题标题】:How can I cancel a StreamSubscription that I open in my main function如何取消在主函数中打开的 StreamSubscription
【发布时间】:2019-06-24 21:20:17
【问题描述】:

我不确定我是否在这里采用了正确的方法。我想使用连接包 (https://pub.dev/packages/connectivity#-readme-tab-) 监听连接变化。

但我不想在特定屏幕/小部件上收听连接变化。相反,我希望应用能够在全局范围内监听连接变化,并在连接重新联机时同步数据。

我的第一个方法是放

var StreamSubscription subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
// Got a new connectivity status! })

在我的主要功能中。但后来我收到一个错误,提醒我需要取消已打开的订阅。如果我在主函数中打开流订阅,我会怎么做? 还是应该将订阅监听器放在其他地方?

非常感谢您的帮助

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    ma​​in 函数调用 runApp 来显示您应用的顶级类。 在创建新的 Flutter 应用时 - 它称为 MyApp。我会用它作为例子。

    您可以做的,就是将 MyApp 更改为 StatefulWidget。在此之后,您可以使用它的 initState 创建订阅,该订阅将一直存在到应用关闭为止。

    import 'dart:async';
    
    import 'package:flutter/material.dart';
    import 'package:connectivity/connectivity.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      // Define a class variable to hold your subscription
      StreamSubscription subscription;
    
      @override
      void initState() {
        super.initState();
    
        // initialize subscription
        subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
          print('Got a new connectivity status!');
          print(result.toString());
        });
      }
    
      @override
      void dispose() {
        // cancel your subscription when the class is removed
        subscription.cancel();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          .....
        );
      }
    }
    

    PS。不要忘记总是取消任何关于类 dispose 的订阅。

    希望这会有所帮助。

    【讨论】:

    • 是否适用于所有状态变化,例如应用何时冻结和恢复?
    • 即使应用处于后台模式也会触发。您可以粘贴上面的代码,运行它,按“主页”按钮并启用/禁用 wifi 连接。该应用程序仍会将连接更改输出到控制台。
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 2020-10-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多