gpt4 book ai didi

flutter - 如何取消在主函数中打开的 StreamSubscription

转载 作者:IT王子 更新时间:2023-10-29 07:17:54 24 4
gpt4 key购买 nike

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

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

我的第一个方法是把

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

在我的主要功能中。但随后我收到一条错误消息,提醒我需要取消已打开的订阅。如果我在我的主要功能中打开流订阅,我该怎么做?或者我应该将订阅监听器放在其他地方吗?

非常感谢您的帮助

最佳答案

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(
.....
);
}
}

附言。不要忘记始终取消对类 dispose 的任何订阅。

希望这对您有所帮助。

关于flutter - 如何取消在主函数中打开的 StreamSubscription,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56744110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com