123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- import 'dart:developer';
- import 'package:agora_rtc_engine/rtc_engine.dart';
- import 'package:agora_rtc_engine/rtc_local_view.dart' as RtcLocalView;
- import 'package:agora_rtc_engine/rtc_remote_view.dart' as RtcRemoteView;
- import 'package:agora_rtc_engine_example/config/agora.config.dart' as config;
- import 'package:flutter/cupertino.dart';
- import 'package:flutter/foundation.dart';
- import 'package:flutter/material.dart';
- import 'package:permission_handler/permission_handler.dart';
- /// MultiChannel Example
- class JoinChannelVideo extends StatefulWidget {
- @override
- State<StatefulWidget> createState() => _State();
- }
- class _State extends State<JoinChannelVideo> {
- late final RtcEngine _engine;
- String channelId = config.channelId;
- bool isJoined = false, switchCamera = true, switchRender = true;
- List<int> remoteUid = [];
- TextEditingController? _controller;
- @override
- void initState() {
- super.initState();
- _controller = TextEditingController(text: channelId);
- this._initEngine();
- }
- @override
- void dispose() {
- super.dispose();
- _engine.destroy();
- }
- _initEngine() async {
- _engine = await RtcEngine.createWithContext(RtcEngineContext(config.appId));
- this._addListeners();
- await _engine.enableVideo();
- await _engine.startPreview();
- await _engine.setChannelProfile(ChannelProfile.LiveBroadcasting);
- await _engine.setClientRole(ClientRole.Broadcaster);
- }
- _addListeners() {
- _engine.setEventHandler(RtcEngineEventHandler(
- joinChannelSuccess: (channel, uid, elapsed) {
- log('joinChannelSuccess ${channel} ${uid} ${elapsed}');
- setState(() {
- isJoined = true;
- });
- },
- userJoined: (uid, elapsed) {
- log('userJoined ${uid} ${elapsed}');
- setState(() {
- remoteUid.add(uid);
- });
- },
- userOffline: (uid, reason) {
- log('userOffline ${uid} ${reason}');
- setState(() {
- remoteUid.removeWhere((element) => element == uid);
- });
- },
- leaveChannel: (stats) {
- log('leaveChannel ${stats.toJson()}');
- setState(() {
- isJoined = false;
- remoteUid.clear();
- });
- },
- ));
- }
- _joinChannel() async {
- if (defaultTargetPlatform == TargetPlatform.android) {
- await [Permission.microphone, Permission.camera].request();
- }
- await _engine.joinChannel(config.token, channelId, null, config.uid);
- }
- _leaveChannel() async {
- await _engine.leaveChannel();
- }
- _switchCamera() {
- _engine.switchCamera().then((value) {
- setState(() {
- switchCamera = !switchCamera;
- });
- }).catchError((err) {
- log('switchCamera $err');
- });
- }
- _switchRender() {
- setState(() {
- switchRender = !switchRender;
- remoteUid = List.of(remoteUid.reversed);
- });
- }
- @override
- Widget build(BuildContext context) {
- return Stack(
- children: [
- Column(
- children: [
- TextField(
- controller: _controller,
- decoration: InputDecoration(hintText: 'Channel ID'),
- onChanged: (text) {
- setState(() {
- channelId = text;
- });
- },
- ),
- Row(
- children: [
- Expanded(
- flex: 1,
- child: ElevatedButton(
- onPressed:
- isJoined ? this._leaveChannel : this._joinChannel,
- child: Text('${isJoined ? 'Leave' : 'Join'} channel'),
- ),
- )
- ],
- ),
- _renderVideo(),
- ],
- ),
- Align(
- alignment: Alignment.bottomRight,
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- ElevatedButton(
- onPressed: this._switchCamera,
- child: Text('Camera ${switchCamera ? 'front' : 'rear'}'),
- ),
- ],
- ),
- )
- ],
- );
- }
- _renderVideo() {
- return Expanded(
- child: Stack(
- children: [
- RtcLocalView.SurfaceView(),
- Align(
- alignment: Alignment.topLeft,
- child: SingleChildScrollView(
- scrollDirection: Axis.horizontal,
- child: Row(
- children: List.of(remoteUid.map(
- (e) => GestureDetector(
- onTap: this._switchRender,
- child: Container(
- width: 120,
- height: 120,
- child: RtcRemoteView.SurfaceView(
- uid: e,
- ),
- ),
- ),
- )),
- ),
- ),
- )
- ],
- ),
- );
- }
- }
|