我正在按照 this 教程使用 flutter_webrtc 插件在 Flutter 中做一个简单的演示应用程序。当我使用 Chrome 进行测试时,它工作得很好,在模拟器中,相机图像从不显示,而当我在我的 Android 智能手机上测试时,相机图像仅在我锁定(电源按钮)和解锁(再次电源按钮)设备时出现。
我正在使用 Windows 11、Android Studio 2022.1.1 补丁 1、Flutter 3.7.5、Dart 2.19.1 OpenJDK 19.0.2 和 flutter_webrtc 0.9.23.
现在我的代码如下:
import 'package:flutter/material.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _localVideoRenderer = RTCVideoRenderer();
void initRenderers() async {
await _localVideoRenderer.initialize();
}
_getUserMedia() async {
final Map<String, dynamic> mediaConstraints = {
'audio': true,
'video': true,
};
MediaStream stream =
await navigator.mediaDevices.getUserMedia(mediaConstraints);
_localVideoRenderer.srcObject = stream;
_localVideoRenderer.srcObject = stream;
return stream;
}
@override
void initState() {
initRenderers();
_getUserMedia();
super.initState();
}
@override
void dispose() async {
await _localVideoRenderer.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final ButtonStyle style =
ElevatedButton.styleFrom(textStyle: const TextStyle(fontSize: 20));
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Stack(
children: [
Positioned(
top: 0.0,
right: 0.0,
left: 0.0,
bottom: 0.0,
child: RTCVideoView(_localVideoRenderer))
],
),
);
}
}
我已经尝试在多个平台上进行测试,已经尝试调用在按钮上显示相机图像的方法,并且已经尝试使用其他教程。
这个好像跟flutter状态管理有关,我补充一下:
setState(() {
});
在
srcObject = stream
之后它起作用了!