StateError(错误状态:调用关闭后无法添加新事件)



我使用的是这个包:https://pub.dev/packages/dart_vlc用于在我的Flutter应用程序的一个页面上流式传输多个摄像头。但我面临着一个问题,当我更改页面并转到另一个页面时,我会得到以下错误:

未处理的异常:StateError(错误状态:调用关闭后无法添加新事件(

下面是我的流媒体页面的代码:

class CameraScreen extends StatefulWidget {
CameraScreen(
{required Key key,
required this.onPageChange,
required this.onLogout,
required this.id})
: super(key: key);
final Function(String, String) onPageChange;
final VoidCallback onLogout;
final String id;
@override
CameraScreenState createState() => CameraScreenState();
}
class CameraScreenState extends State<CameraScreen>
with TickerProviderStateMixin {
PageConfig pageConfig = PageConfig();
String project = '';
List<ResponsiveGridCol> children = [];
List<Player> players = [];
List<dynamic> items = [];
double initialSliderValue = 0;
Player playerOfTheExpandedImg =
Player(id: 1000, videoWidth: 1200, videoHeight: 800);
@override
void initState() {
project = Project.getCurrentProject();
pageConfig = Project.getProjectPageDetails(widget.id);
getData();
super.initState();
}
@override
void dispose() {
stopAndDisposePlayers();
super.dispose();
}
@override
Widget build(BuildContext context) {
return CustomScaffold(
text: pageConfig.name!,
onPageChange: widget.onPageChange,
onLogout: widget.onLogout,
body: Padding(
padding: const EdgeInsets.all(8.0),
child: SingleChildScrollView(
child: ResponsiveGridRow(
children: children,
),
),
),
);
}
getData() async {
File cameraFile = File(AppStrings.CONFIG_DIRECTORY_PATH +
project +
AppStrings.CAMERA_CONFIG_FILE_NAME);
items = jsonDecode(cameraFile.readAsStringSync());
int i = 0;
List<ResponsiveGridCol> widgets = [];
for (var item in items) {
var cameraConfig = Camera.fromJson(item);
Player player = Player(id: i, videoWidth: 400, videoHeight: 300);
var media = await Media.network(cameraConfig.url,
parse: true, timeout: Duration(seconds: 2));
await player.open(media);
await player.play();
players.add(player);
widgets.add(
ResponsiveGridCol(
lg: 6,
child: Card(
key: Key('$i'),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(cameraConfig.title, style: AppStyles.BOLD),
Text('Telecamere'),
Video(
playerId: i,
width: 500,
height: 375,
showControls: false,
),
Divider(),
IconButton(
icon: Icon(Icons.open_in_browser),
onPressed: () async {
var stream = await createStreamForExpandedImg(item);
showDialog(
context: context,
builder: (BuildContext context) {
return ExpandedCamImg(
player: playerOfTheExpandedImg,
stream: stream,
cameraConfig: cameraConfig);
},
).whenComplete(() async {
await playerOfTheExpandedImg.stop();
await playerOfTheExpandedImg.dispose();
});
},
)
],
),
),
),
);
i++;
}
if (mounted) {
setState(() {
children = widgets;
});
} else
return;
}
Future<Video> createStreamForExpandedImg(dynamic item) async {
playerOfTheExpandedImg =
Player(id: 1000, videoWidth: 1200, videoHeight: 800);
var stream = Video(
playerId: 1000,
width: 1200,
height: 800,
showControls: false,
);
var cameraConfig = Camera.fromJson(item);
var media = await Media.network(cameraConfig.url,
parse: true, timeout: Duration(seconds: 2));
await playerOfTheExpandedImg.open(media);
await playerOfTheExpandedImg.play();
return stream;
}
stopAndDisposePlayers() async {
for (var player in players) {
await player.stop();
await player.dispose();
}
}
}

我想这是一个问题,当调用dispose()时,所有的players都没有正确地关闭和销毁。

此问题的原因是流控制器在关闭后被访问。可能是由于player.dispose()。您可以在这里添加一个检查器,以确保在调用dispose()之后不会添加新事件。

bool _isDisposed = false;
stopAndDisposePlayers() async {
_isDisposed = true;

...
}

然后,您可以在启动流之前使用_isDisposed进行检查。

最新更新