string_uid.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import 'dart:developer';
  2. import 'package:agora_rtc_engine/rtc_engine.dart';
  3. import 'package:agora_rtc_engine_example/config/agora.config.dart' as config;
  4. import 'package:flutter/cupertino.dart';
  5. import 'package:flutter/foundation.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:permission_handler/permission_handler.dart';
  8. /// MultiChannel Example
  9. class StringUid extends StatefulWidget {
  10. @override
  11. State<StatefulWidget> createState() => _State();
  12. }
  13. class _State extends State<StringUid> {
  14. late final RtcEngine _engine;
  15. String channelId = config.channelId;
  16. String stringUid = config.stringUid;
  17. bool isJoined = false;
  18. TextEditingController? _controller0, _controller1;
  19. @override
  20. void initState() {
  21. super.initState();
  22. _controller0 = TextEditingController(text: channelId);
  23. _controller1 = TextEditingController(text: stringUid);
  24. this._initEngine();
  25. }
  26. @override
  27. void dispose() {
  28. super.dispose();
  29. _engine.destroy();
  30. }
  31. _initEngine() async {
  32. _engine = await RtcEngine.createWithContext(RtcEngineContext(config.appId));
  33. this._addListeners();
  34. await _engine.setChannelProfile(ChannelProfile.LiveBroadcasting);
  35. await _engine.setClientRole(ClientRole.Broadcaster);
  36. }
  37. _addListeners() {
  38. _engine.setEventHandler(RtcEngineEventHandler(
  39. joinChannelSuccess: (channel, uid, elapsed) {
  40. log('joinChannelSuccess ${channel} ${uid} ${elapsed}');
  41. setState(() {
  42. isJoined = true;
  43. });
  44. },
  45. leaveChannel: (stats) {
  46. log('leaveChannel ${stats.toJson()}');
  47. setState(() {
  48. isJoined = false;
  49. });
  50. },
  51. ));
  52. }
  53. _joinChannel() async {
  54. if (defaultTargetPlatform == TargetPlatform.android) {
  55. await Permission.microphone.request();
  56. }
  57. await _engine.joinChannelWithUserAccount(
  58. config.token, channelId, stringUid);
  59. }
  60. _leaveChannel() async {
  61. await _engine.leaveChannel();
  62. }
  63. _getUserInfo() {
  64. _engine.getUserInfoByUserAccount(stringUid).then((userInfo) {
  65. log('getUserInfoByUserAccount ${userInfo.toJson()}');
  66. ScaffoldMessenger.of(context).showSnackBar(SnackBar(
  67. content: Text('${userInfo.toJson()}'),
  68. ));
  69. }).catchError((err) {
  70. log('getUserInfoByUserAccount ${err}');
  71. });
  72. }
  73. @override
  74. Widget build(BuildContext context) {
  75. return Stack(
  76. children: [
  77. Column(
  78. children: [
  79. TextField(
  80. controller: _controller0,
  81. decoration: InputDecoration(hintText: 'Channel ID'),
  82. onChanged: (text) {
  83. setState(() {
  84. channelId = text;
  85. });
  86. },
  87. ),
  88. TextField(
  89. controller: _controller1,
  90. decoration: InputDecoration(hintText: 'String User ID'),
  91. onChanged: (text) {
  92. setState(() {
  93. stringUid = text;
  94. });
  95. },
  96. ),
  97. Row(
  98. children: [
  99. Expanded(
  100. flex: 1,
  101. child: ElevatedButton(
  102. onPressed:
  103. isJoined ? this._leaveChannel : this._joinChannel,
  104. child: Text('${isJoined ? 'Leave' : 'Join'} channel'),
  105. ),
  106. )
  107. ],
  108. ),
  109. ],
  110. ),
  111. Align(
  112. alignment: Alignment.bottomRight,
  113. child: Column(
  114. mainAxisSize: MainAxisSize.min,
  115. children: [
  116. ElevatedButton(
  117. onPressed: this._getUserInfo,
  118. child: Text('Get userInfo'),
  119. ),
  120. ],
  121. ),
  122. )
  123. ],
  124. );
  125. }
  126. }