如何取消在主要功能中打开的StreamSubscription

时间:2019-06-24 21:20:17

标签: flutter dart

我不确定在这里是否遵循正确的方法。我想使用连接软件包(https://pub.dev/packages/connectivity#-readme-tab-)来监听连接更改。

但是我不想听特定屏幕/小部件上的连接更改。相反,我希望该应用程序全局监听连接更改,并在连接恢复联机时同步数据。

我的第一种方法是

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

在我的主要职能中。但是然后我得到一个错误,提醒我需要取消打开的订阅。如果在主要功能中打开流订阅,该怎么办? 还是应该将订阅侦听器放在其他位置?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

主要功能调用了 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。不要忘记总是取消类处置中的任何订阅。

希望这会有所帮助。