Flutter plugin to simply integrate Agora Video Calling or Live Video Streaming to your app with just a few lines of code.

Overview

Agora UI Kit for Flutter

Platform License: MIT

Instantly integrate Agora video calling or video streaming into your Flutter application.

Getting started

Requirements

Installation

In your Flutter application, add the agora_uikit as a dependency inside your pubspec.yaml file.

In your Android level build.gradle add this at the end of the repositories:

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

Device Permission

Agora Video SDK requires camera and microphone permission to start video call.

Android

Open the AndroidManifest.xml file and add the required device permissions to the file.

<manifest>
...
<uses-permission  android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission  android:name="android.permission.INTERNET"  />
<uses-permission  android:name="android.permission.RECORD_AUDIO"  />
<uses-permission  android:name="android.permission.CAMERA"  />
<uses-permission  android:name="android.permission.MODIFY_AUDIO_SETTINGS"  />
<uses-permission  android:name="android.permission.ACCESS_NETWORK_STATE"  />
<!-- The Agora SDK requires Bluetooth permissions in case users are using Bluetooth devices.-->
<uses-permission  android:name="android.permission.BLUETOOTH"  />
...
</manifest>

iOS

Open info.plist and add:

  • Privacy - Microphone Usage Description, and add a note in the Value column.
  • Privacy - Camera Usage Description, and add a note in the Value column.

Your application can still run the voice call when it is switched to the background if the background mode is enabled. Select the app target in Xcode, click the Capabilities tab, enable Background Modes, and check Audio, AirPlay, and Picture in Picture.

Usage

final AgoraClient client = AgoraClient(
  agoraConnectionData: AgoraConnectionData(
    appId: "<--Add Your App Id Here-->",
    channelName: "test",
  ),
  enabledPermission: [
    Permission.camera,
    Permission.microphone,
  ],
);

@override
Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      body: SafeArea(
        child: Stack(
          children: [
            AgoraVideoViewer(client: client), 
            AgoraVideoButtons(client: client),
          ],
        ),
      ),
    ),
  );
}

UIKits

The plan is to grow this library and have similar offerings across all supported platforms. There are already similar libraries for Android, React Native, and iOS, so be sure to check them out.

Comments
  • [BUG] With Video Calls

    [BUG] With Video Calls

    When using on Android Samsung Galaxy S20+ and Note 8 I came across an issue that the video for the Galaxy s20+ would disappear on the Note 8. I at first thought it only happened when pressing the mute button on the s20+ but it happens randomly when the devices are moved also.

    bug 
    opened by rlee1990 18
  • [BUG] I got black screen in flutter v2.8.1

    [BUG] I got black screen in flutter v2.8.1

    Warnings:

    Warning: Mapping new ns http://schemas.android.com/repository/android/common/02 to old ns http://schemas.android.com/repository/android/common/01
    Warning: Mapping new ns http://schemas.android.com/repository/android/generic/02 to old ns http://schemas.android.com/repository/android/generic/01
    Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/addon2/02 to old ns http://schemas.android.com/sdk/android/repo/addon2/01
    Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/repository2/02 to old ns http://schemas.android.com/sdk/android/repo/repository2/01
    Warning: Mapping new ns http://schemas.android.com/sdk/android/repo/sys-img2/02 to old ns http://schemas.android.com/sdk/android/repo/sys-img2/01
    

    Error:

    
    I/BufferQueue(27995): [unnamed-27995-0](this:0x7d03363800,id:0,api:0,p:-1,c:-1) BufferQueue core=(27995:com.asoft.timemarks.hm.timemarks)
    E/libc    (27995): Access denied finding property "vendor.debug.sf.stc_interval"
    W/ks.hm.timemarks(27995): type=1400 audit(0.0:1025010): avc: denied { read } for name="u:object_r:graphics_debug_prop:s0" dev="tmpfs" ino=959 scontext=u:r:untrusted_app:s0:c73,c258,c512,c768 tcontext=u:object_r:graphics_debug_prop:s0 tclass=file permissive=0
    W/ks.hm.timemarks(27995): type=1400 audit(0.0:1025011): avc: denied { read } for name="u:object_r:debug_bq_dump_prop:s0" dev="tmpfs" ino=919 scontext=u:r:untrusted_app:s0:c73,c258,c512,c768 tcontext=u:object_r:debug_bq_dump_prop:s0 tclass=file permissive=0
    E/libc    (27995): Access denied finding property "vendor.debug.bq.dump"
    I/BufferQueueConsumer(27995): [unnamed-27995-0](this:0x7d03363800,id:0,api:0,p:-1,c:27995) connect(C): consumer=(27995:com.asoft.timemarks.hm.timemarks) controlledByApp=true
    E/libc    (27995): Access denied finding property "vendor.debug.bq.dump"
    I/BufferQueueConsumer(27995): [unnamed-27995-0](this:0x7d03363800,id:0,api:0,p:-1,c:27995) setConsumerName: unnamed-27995-0
    E/libc    (27995): Access denied finding property "vendor.debug.bq.line"
    W/ks.hm.timemarks(27995): type=1400 audit(0.0:1025012): avc: denied { read } for name="u:object_r:debug_bq_dump_prop:s0" dev="tmpfs" ino=919 scontext=u:r:untrusted_app:s0:c73,c258,c512,c768 tcontext=u:object_r:debug_bq_dump_prop:s0 tclass=file permissive=0
    W/ks.hm.timemarks(27995): type=1400 audit(0.0:1025013): avc: denied { read } for name="u:object_r:graphics_debug_prop:s0" dev="tmpfs" ino=959 scontext=u:r:untrusted_app:s0:c73,c258,c512,c768 tcontext=u:object_r:graphics_debug_prop:s0 tclass=file permissive=0
    E/libc    (27995): Access denied finding property "vendor.debug.bq.dump"
    I/BufferQueueConsumer(27995): [SurfaceTexture-0-27995-0](this:0x7d03363800,id:0,api:0,p:-1,c:27995) setConsumerName: SurfaceTexture-0-27995-0
    E/libc    (27995): Access denied finding property "vendor.debug.bq.line"
    W/ks.hm.timemarks(27995): type=1400 audit(0.0:1025014): avc: denied { read } for name="u:object_r:debug_bq_dump_prop:s0" dev="tmpfs" ino=919 scontext=u:r:untrusted_app:s0:c73,c258,c512,c768 tcontext=u:object_r:debug_bq_dump_prop:s0 tclass=file permissive=0
    W/ks.hm.timemarks(27995): type=1400 audit(0.0:1025015): avc: denied { read } for name="u:object_r:graphics_debug_prop:s0" dev="tmpfs" ino=959 scontext=u:r:untrusted_app:s0:c73,c258,c512,c768 tcontext=u:object_r:graphics_debug_prop:s0 tclass=file permissive=0
    I/GLConsumer(27995): [SurfaceTexture-0-27995-0] detachFromContext
    
    

    Black Screen

    WhatsApp Image 2022-01-30 at 1 29 13 PM

    Build.gradle

    image image

    Code:

    image

    bug 
    opened by lkrjangid1 17
  • A SessionController was used after being disposed.

    A SessionController was used after being disposed.

    Once you have called dispose() on a SessionController, it can no longer be used. When the exception was thrown, this was the stack: #0 ChangeNotifier._debugAssertNotDisposed. (package:flutter/src/foundation/change_notifier.dart:114:9) #1 ChangeNotifier._debugAssertNotDisposed (package:flutter/src/foundation/change_notifier.dart:120:6) #2 ChangeNotifier.removeListener (package:flutter/src/foundation/change_notifier.dart:233:12) #3 _ValueListenableBuilderState.dispose (package:flutter/src/widgets/value_listenable_builder.dart:177:28) #4 StatefulElement.unmount (package:flutter/src/widgets/framework.dart:4895:11) #5 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1883:13) #6 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #7 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #8 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #9 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #10 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #11 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #12 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #13 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #14 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #15 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #16 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #17 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #18 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #19 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #20 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #21 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #22 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #23 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #24 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #25 MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6297:16) #26 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #27 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #28 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #29 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #30 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #31 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #32 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #33 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #34 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #35 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #36 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #37 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #38 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #39 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #40 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #41 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #42 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #43 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #44 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #45 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #46 MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6297:16) #47 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #48 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #49 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #50 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #51 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #52 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #53 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #54 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #55 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #56 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #57 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #58 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #59 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #60 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #61 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #62 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #63 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #64 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #65 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #66 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #67 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #68 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #69 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #70 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #71 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #72 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #73 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #74 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #75 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #76 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #77 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #78 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #79 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #80 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #81 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #82 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #83 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #84 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #85 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #86 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #87 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #88 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #89 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #90 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #91 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #92 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #93 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #94 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #95 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #96 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #97 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #98 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #99 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #100 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #101 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #102 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #103 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #104 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #105 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #106 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #107 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #108 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #109 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #110 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #111 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #112 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #113 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #114 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #115 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #116 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #117 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #118 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #119 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #120 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #121 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #122 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #123 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #124 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #125 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #126 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #127 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #128 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #129 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #130 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #131 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #132 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #133 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #134 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #135 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #136 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #137 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #138 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #139 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #140 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #141 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #142 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #143 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #144 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #145 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #146 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #147 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #148 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #149 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #150 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #151 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #152 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #153 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #154 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #155 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #156 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #157 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #158 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #159 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #160 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #161 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #162 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #163 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #164 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #165 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #166 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6182:14) #167 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #168 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #169 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #170 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #171 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #172 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #173 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #174 _InactiveElements._unmount. (package:flutter/src/widgets/framework.dart:1881:7) #175 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:4719:14) #176 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1879:13) #177 ListIterable.forEach (dart:_internal/iterable.dart:39:13) #178 _InactiveElements._unmountAll (package:flutter/src/widgets/framework.dart:1892:25) #179 BuildOwner.finalizeTree. (package:flutter/src/widgets/framework.dart:2879:27) #180 BuildOwner.lockState (package:flutter/src/widgets/framework.dart:2510:15) #181 BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:2878:7) #182 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:884:19) #183 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:319:5) #184 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1143:15) #185 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1080:9) #186 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:996:5) #190 _invoke (dart:ui/hooks.dart:166:10) #191 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:270:5) #192 _drawFrame (dart:ui/hooks.dart:129:31) (elided 3 frames from dart:async)

    bug 
    opened by mohit41999 17
  • Allow Tokens To Be Passed

    Allow Tokens To Be Passed

    It would be useful to allow us to also just provide a token and not just a temp token or a token url as we are creating our tokens using accounts for string uids and so I get the token before calling the uikit functions but I can't pass it to uikit I receive an error for temptoken.

    enhancement 
    opened by rlee1990 14
  • how to send and receive messages in rtm

    how to send and receive messages in rtm

    Hello I have been trying to send and receive message through the AgoraRtmChannel Object. But whenever i listen to messages through the onMessageReceived, it tells me that I called the onMessageReceived on null,

    Here is the code:

    ` The client is already initialized and I have also provided a username to  use RTM`
    _channel = client.sessionController.value.agoraRtmChannel;
    _channel.onMessageReceived = (rtmMessage, member) {
          print(rtmMessage.text);
        };
    

    Here is the error :

    The setter 'onMessageReceived=' was called on null.
    Receiver: null
    Tried calling: onMessageReceived=Closure: (AgoraRtmMessage, AgoraRtmMember) => Null
    
    opened by Nader2004 9
  • [BUG] onError: ErrorCode.JoinChannelRejected

    [BUG] onError: ErrorCode.JoinChannelRejected

    Describe the bug getting error on joining a room

    Local video state changed state: LocalVideoStreamState.Failed and error: LocalVideoStreamError.DeviceNotFound
    onError: ErrorCode.JoinChannelRejected
    

    To Reproduce Steps to reproduce the behavior: once on

    Expected behavior

    • so once joining a room on a video call I get the error
    • if joining on a real device I get the error but I join the call
    • using IOS simulator I get the error with joining the call

    Screenshots

    image Imgur Imgur

    Desktop (please complete the following information):

    • OS: [e.g. iOS]
    • Browser [e.g. chrome, safari]
    • Version [e.g. 22]

    Smartphone (please complete the following information):

    • Device: Iphone 8+
    • Device: simulator 13
    • Os: 15
    bug 
    opened by moesaid 7
  • [BUG][iOS] App Crashed after launching on iphone 12

    [BUG][iOS] App Crashed after launching on iphone 12

    Describe the bug On Android the worked fine, but on iPhone 12 it crashed with the below exception:

    flutter: onJoinChannel: agora_test_poc, uid: 1221795414
    flutter: userJoined: 4183955454
    flutter: Remote audio state changed for 4183955454, state: AudioRemoteState.Starting and reason: AudioRemoteStateReason.Internal
    -[__NSDictionaryM longLongValue]: unrecognized selector sent to instance 0x2801f2f20
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM longLongValue]: unrecognized selector sent to instance 0x2801f2f20'
    *** First throw call stack:
    (0x18bf2e708 0x1a0a387a8 0x18be31bfc 0x18bf31260 0x18bf33560 0x10d1d9bb8 0x10d1d5400 0x10d4eaa60 0x10d1fbd7c 0x10d505070 0x10d49f1d4 0x10d4a19fc 0x18bea91d4 0x18bea8dd0 0x18bea8220 0x18bea1fd4 0x18bea1308 0x1a3524734 0x18e91f75c 0x18e924fcc 0x1005b2418 0x18bb5dcf8)
    libc++abi: terminating with uncaught exception of type NSException
    * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
        frame #0: 0x00000001ba233334 libsystem_kernel.dylib`__pthread_kill + 8
    libsystem_kernel.dylib`__pthread_kill:
    ->  0x1ba233334 <+8>:  b.lo   0x1ba233354               ; <+40>
        0x1ba233338 <+12>: pacibsp
        0x1ba23333c <+16>: stp    x29, x30, [sp, #-0x10]!
        0x1ba233340 <+20>: mov    x29, sp
    

    To Reproduce Steps to reproduce the behavior:

    1. Launch the app on real iphone device
    2. The app crashed after the user joins the channel

    Expected behavior Shouldn't crash

    Screenshots If applicable, add screenshots to help explain your problem.

    Desktop (please complete the following information):

    • OS: iOS
    • Browser [e.g. chrome, safari]
    • Version 14.5

    I also don't see the video being rendered.

    bug 
    opened by luvishq 7
  • [BUG] tokenUrl is not generating the token and giving a 404 Not Found

    [BUG] tokenUrl is not generating the token and giving a 404 Not Found

    @maxxfrazer @Ascenio @hxingpax @Meherdeep @tadaspetra Describe the bug agora_uikit: ^0.0.4 agora_rtc_engine: ^4.2.0

    I hosted https://github.com/AgoraIO-Community/agora-token-service server on Heroku and just copied the base Url of the server: https://nikah----match.herokuapp.com/ as the tokenUrl in the AgoraConnectionData constructor as given here:

    final AgoraClient client = AgoraClient(
        agoraConnectionData: AgoraConnectionData(
          appId: "", //omitted for security reasons
          tokenUrl: "https://nikah----match.herokuapp.com",
          // tokenUrl: "https://nikah--match.herokuapp.com/access_token?",
          channelName: channelName,
          uid: 0,
        ),
        enabledPermission: [
          Permission.camera,
          Permission.microphone,
        ],
      );
    //the commented line was my previous NodeJS server with old code and different parameters. 
    //that's why I hosted this one now as the link in the original AgoraConnectionData class referred //to this server.
    

    and got the error:

    I/flutter (15044): Not Found
    I/flutter (15044): Failed to generate the token : 404
    W/System.err(15044): java.lang.reflect.InvocationTargetException
    W/System.err(15044): 	at java.lang.reflect.Method.invoke(Native Method)
    W/System.err(15044): 	at io.agora.agora_rtc_engine.AgoraRtcEnginePlugin.onMethodCall(AgoraRtcEnginePlugin.kt:124)
    W/System.err(15044): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262)
    W/System.err(15044): 	at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:296)
    W/System.err(15044): 	at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$DartMessenger(DartMessenger.java:320)
    W/System.err(15044): 	at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$TsixYUB5E6FpKhMtCSQVHKE89gQ.run(Unknown Source:12)
    W/System.err(15044): 	at android.os.Handler.handleCallback(Handler.java:938)
    W/System.err(15044): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    W/System.err(15044): 	at android.os.Looper.loop(Looper.java:264)
    W/System.err(15044): 	at android.app.ActivityThread.main(ActivityThread.java:8282)
    W/System.err(15044): 	at java.lang.reflect.Method.invoke(Native Method)
    W/System.err(15044): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
    W/System.err(15044): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
    W/System.err(15044): Caused by: java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String
    W/System.err(15044): 	at io.agora.rtc.base.RtcEngineManager.joinChannel(RtcEngine.kt:448)
    W/System.err(15044): 	... 13 more
    E/flutter (15044): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: MissingPluginException(No implementation found for method joinChannel on channel agora_rtc_engine)
    E/flutter (15044): #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:175:7)
    E/flutter (15044): <asynchronous suspension>
    E/flutter (15044): #1      SessionController.joinVideoChannel (package:agora_uikit/controllers/session_controller.dart:404:5)
    E/flutter (15044): <asynchronous suspension>
    E/flutter (15044): #2      AgoraClient.initialize (package:agora_uikit/src/agora_client.dart:69:5)
    E/flutter (15044): <asynchronous suspension>
    E/flutter (15044): #3      _VideoCallAgoraUIKitState.initAgora (package:nikah_match/view/video_call/agoraUI_video_call.dart:54:5)
    E/flutter (15044): <asynchronous suspension>
    E/flutter (15044): 
    
    
    

    What else I tried:

    https://nikah----match.herokuapp.com/rtc
    
    https://nikah----match.herokuapp.com/rtc/test/publisher/uid/0
    
    https://nikah----match.herokuapp.com/rtc/:channelName/publisher/uid/0
    
    https://nikah----match.herokuapp.com/rtc/$channelName/publisher/uid/0
    
    https://nikah----match.herokuapp.com/rtc/:channelName/:role/:tokentype/:uid
    

    To Reproduce Steps to reproduce the behavior:

    1. use the given code with the agora_uikit: ^0.0.4
    2. See the console

    Expected behavior A token is generated and the call starts.

    Screenshots If applicable, add screenshots to help explain your problem (N/A).

    Desktop (please complete the following information):

    • OS: Windows

    Smartphone (please complete the following information):

    • Device: OPPO F15
    • OS: Android 11

    Additional context Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel stable, 2.10.3, on Microsoft Windows [Version 10.0.19044.1526], locale en-US) [√] Android toolchain - develop for Android devices (Android SDK version 32.0.0) [√] Chrome - develop for the web [√] Visual Studio - develop for Windows (Visual Studio Build Tools 2019 16.11.10) [√] Android Studio (version 2021.1) [√] IntelliJ IDEA Community Edition (version 2021.3) [√] VS Code (version 1.65.2) [√] Connected device (4 available) [√] HTTP Host Availability

    • No issues found!

    bug 
    opened by waqadArshad 6
  • Live Stream Issue

    Live Stream Issue

    Describe the bug When an audience member joins a live stream as an audience member their view is split with a blank top half even though there is only 1 person broadcasting.

    To Reproduce Steps to reproduce the behavior: Create a live stream as a broadcaster and have someone view it as an audience member.

    Expected behavior Should just show the broadcaster taking the whole view.

    Smartphone (please complete the following information):

    • Device: iPhone 8, Samsung Galaxy Note 8, and Samsung Galaxy Fold 3
    • OS: ios 15
    bug 
    opened by rlee1990 6
  • Refactors AgoraClient's initialization

    Refactors AgoraClient's initialization

    Closes #13.

    Moves initialization of AgoraClient from its constructor (implicit) to a proper function (explicit). This means that it's the user responsability to check for it, but it also gives the power to know when it's ready.

    Release Notes

    • BREAKING CHANGE: Must call initialize on AgoraClient before further usage.

    Pull request checklist

    Please check if your PR fulfills the following requirements:

    • [ ] Tests for the changes have been added (for bug fixes / features)
    • [X] Docs have been reviewed and added / updated if needed (for bug fixes / features)
    • [ ] The GitHub Actions pass building and linting. Linter returns no warnings or errors.
    • [X] The QA checklist below has been completed

    Pull request type

    Please check the type of change your PR introduces:

    • [ ] Bugfix
    • [X] Feature
    • [ ] Code style update (formatting, renaming)
    • [ ] Refactoring (no functional changes, no api changes)
    • [ ] Build related changes
    • [ ] Documentation content changes
    • [ ] Other (please describe):

    What is the current behavior?

    The initialization is triggered by the constructor of AgoraClient at initialization and if it happens to failure, it can't recover from it.

    Issue Number: #13

    What is the new behavior?

    The initialization is triggered by a specific function by the client. If failure happens the client gets to know and can handle it. Also the same instance can be reused.

    Does this introduce a breaking change?

    • [X] Yes
    • [ ] No

    QA Checklist

    UIKit Update Checklist (Minor or Patch Release)

    • [X] Using the latest version of Agora's Video SDK
    • [X] Example apps are all functional
    • [X] Core features are still working (both ways across platforms)
      • [ ] Camera + Mic muting works for local and remote users
      • [ ] Users are added and removed correctly when they join and leave the channel
      • [ ] Older versions of the library gracefully handle changes (Create issue if not)
      • [ ] Builtin buttons all work as expected
    • [ ] Any newly deprecated methods are flagged as such inline and in documentation
    opened by Ascenio 6
  • [FEATURE] Have an option to keep the aspect ratio of remote video?

    [FEATURE] Have an option to keep the aspect ratio of remote video?

    Is your feature request related to a problem? Please describe. It is not an issue but something I think will be very useful for cross platform view.

    Describe the solution you'd like I am looking forward to keep the width and height aspect ratio of each of the remote streams captured by the sdk selects rather than having an expanded view of the remote video which looks too zoomed in and with the probabilities of having UIKit in flutter web, it looks like an important feature to have.

    Describe alternatives you've considered I made use of videoSizeChanged and remoteVideoStateChanged callbacks and was able to work this out in iOS and Android platforms with agora_rtc_engine using FittedBox and AspectRatio widgets. However, web version of agora_rtc_engine (which i understand is not released yet) did not support the call backs so not sure how this can work in web at the moment.

    Additional context This will be very helpful specially when we have a screenshare in the channel as the aspect ratio of the shared content/screen will be maintained rather than being zoomed in.

    enhancement 
    opened by mrtordoide 5
  • Update pubspec.yaml

    Update pubspec.yaml

    Release Version:

    Release Notes

    Pull request checklist

    Please check if your PR fulfills the following requirements:

    • [ ] Tests for the changes have been added (for bug fixes / features)
    • [x] Docs have been reviewed and added / updated if needed (for bug fixes / features)
    • [x] The GitHub Actions pass building and linting. Linter returns no warnings or errors.
    • [x] The QA checklist below has been completed

    Pull request type

    Please check the type of change your PR introduces:

    • [x] Bugfix
    • [ ] Feature
    • [ ] Code style update (formatting, renaming)
    • [ ] Refactoring (no functional changes, no api changes)
    • [ ] Build related changes
    • [ ] Documentation content changes
    • [ ] Other (please describe):

    What is the current behavior?

    Issue Number: 114

    What is the new behavior?

    • Forcefully uses older version of pubspec.yaml
    • Produces no errors

    Does this introduce a breaking change?

    • [ ] Yes
    • [x] No

    QA Checklist

    VideoUIKit Update Checklist (Minor or Patch Release)

    • [ ] Using the latest version of Agora's Video SDK
    • [x] Example apps are all functional
    • [x] Core features are still working (both ways across platforms)
      • [x] Camera + Mic muting works for local and remote users
      • [x] Users are added and removed correctly when they join and leave the channel
      • [x] Older versions of the library gracefully handle changes (Create issue if not)
      • [x] Builtin buttons all work as expected
    • [ ] Any newly deprecated methods are flagged as such inline and in documentation

    VideoUIKit Update Checklist (Major Release)

    • [x] The above checklist is completed (except backwards compatibility)
    • [ ] Thoroughly tested for crashes, across multiple platforms at the same time

    QA Notes

    Other information

    opened by amalnathm7 0
  • [FEATURE] - Customize the DisabledVideoWidget

    [FEATURE] - Customize the DisabledVideoWidget

    There is absolutely no way to customize the UIKIT VideoViewer. For example, the DisabledVideoWidget cannot be customized at all. There are cases when people want to show their profile image or even just the name of the user when they disabled the camera. There is no callback or anything on the UIKIT on knowing which user disabled the camera. Even if you provide your own widget it just stays the same for everyone that disables the video.

    Describe the solution you'd like Maybe a callback in the VideoViewer class when someone disables the video that returns a Widget to set the disabled video widget for anyone that have disabled their camera. That way we can customize the disabled widget for each user that disables the camera.

    enhancement 
    opened by haroonkhan335 0
  • [BUG] - Enabling and Disabling video camera on Video Control buttons does not resume the stream for other users in the channel.

    [BUG] - Enabling and Disabling video camera on Video Control buttons does not resume the stream for other users in the channel.

    Enabling and Disabling Video camera does not work properly to other users that have joined the channel. When you disable the video camera, it works for all the users including the local user. But when re-enabled, only camera enables for the local user and the stream for other users does not update at all. Though the videoStateChanged callback does calls on all the users devices on the stream.

    To Reproduce

    1. Run the basic example project with Agora UIKIT and Agora UIKIT control buttons.
    2. Disable the video. Works for all users.
    3. Enable back the video. Only works for local user and the stream does not get updated for other users on the line.

    Expected behavior Enabling the video should resume the stream for all the users who have joined the channel.

    Smartphone (please complete the following information):

    • Device: Any Android Device
    • OS: Any iOS device.
    • Version: latest on pub.dev
    bug 
    opened by haroonkhan335 0
  • [BUG] No named parameter with the name onMediaDeviceChanged - iOS BUILD FAILED

    [BUG] No named parameter with the name onMediaDeviceChanged - iOS BUILD FAILED

    Describe the bug After upgrading to Flutter 3.3.10 • channel stable started getting this error : Error: No named parameter with the name 'onMediaDeviceChanged'

    To Reproduce Steps to reproduce the behavior: flutter run

    Expected behavior iOS build succefully

    Screenshots Screenshot 2022-12-23 at 16 06 10

    Screenshot 2022-12-23 at 16 09 54 Screenshot 2022-12-23 at 16 10 12

    image

    Desktop (please complete the following information):

    • OS: iOS

    Smartphone (please complete the following information):

    • Device: iPhone Pro Max 16.2 - Simulator

    Additional context After upgrading Flutter start getting this error

    bug 
    opened by yahyamokaied 3
  •   LateError (LateInitializationError: Field 'requestPort' has not been initialized [BUG]

    LateError (LateInitializationError: Field 'requestPort' has not been initialized [BUG]

    LateError (LateInitializationError: Field 'requestPort' has not been initialized when i try this code `import 'dart:async';

    import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart';

    import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import 'package:flutter/material.dart';

    const String appId = "756d0451e027460dbb9212a2f46c141a"; void main() { runApp(const MyApp()); }

    class MyApp extends StatefulWidget { const MyApp({super.key});

    @override State createState() => _MyAppState(); }

    class _MyAppState extends State { late RtcEngine agoraEngine; // Agora engine instance String channelName = "ARyhan"; final GlobalKey scaffoldMessengerKey = GlobalKey(); // Global key to access the scaffold

    String token = "9088f484799548efba2ac5f987c63df9"; int uid = 0; // uid of the local user

    bool _isHost = true; // Indicates whether the user has joined as a host or audience

    bool _isJoined = false; // Indicates if the local user has joined the channel int? _remoteUid; // uid of the remote user

    @override void dispose() async { await agoraEngine.leaveChannel(); super.dispose(); }

    @override void initState() { super.initState(); setupVideoSDKEngine(); }

    showMessage(String message) { scaffoldMessengerKey.currentState?.showSnackBar(SnackBar( content: Text(message), )); }

    Future setupVideoSDKEngine() async { // retrieve or request camera and microphone permissions await [Permission.microphone, Permission.camera].request();

    //create an instance of the Agora engine
    agoraEngine = createAgoraRtcEngine();
    await agoraEngine.initialize(const RtcEngineContext(appId: appId));
    
    await agoraEngine.enableVideo();
    
    // Register the event handler
    agoraEngine.registerEventHandler(
      RtcEngineEventHandler(
        onJoinChannelSuccess: (RtcConnection connection, int elapsed) {
          showMessage(
              "Local user uid:${connection.localUid} joined the channel");
          setState(() {
            _isJoined = true;
          });
        },
        onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) {
          showMessage("Remote user uid:$remoteUid joined the channel");
          setState(() {
            _remoteUid = remoteUid;
          });
        },
        onUserOffline: (RtcConnection connection, int remoteUid,
            UserOfflineReasonType reason) {
          showMessage("Remote user uid:$remoteUid left the channel");
          setState(() {
            _remoteUid = null;
          });
        },
      ),
    );
    

    }

    void join() async { // Set channel options ChannelMediaOptions options;

    // Set channel profile and client role
    if (_isHost) {
      options = const ChannelMediaOptions(
        clientRoleType: ClientRoleType.clientRoleBroadcaster,
        channelProfile: ChannelProfileType.channelProfileLiveBroadcasting,
      );
      await agoraEngine.startPreview();
    } else {
      options = const ChannelMediaOptions(
        clientRoleType: ClientRoleType.clientRoleAudience,
        channelProfile: ChannelProfileType.channelProfileLiveBroadcasting,
      );
    }
    
    await agoraEngine.joinChannel(
      token: token,
      channelId: channelName,
      options: options,
      uid: uid,
    );
    

    }

    void leave() { setState(() { _isJoined = false; _remoteUid = null; }); agoraEngine.leaveChannel(); }

    Widget _videoPanel() { if (!_isJoined) { return const Text( 'Join a channel', textAlign: TextAlign.center, ); } else if (_isHost) { // Local user joined as a host return AgoraVideoView( controller: VideoViewController( rtcEngine: agoraEngine, canvas: VideoCanvas(uid: uid), ), ); } else { // Local user joined as audience if (_remoteUid != null) { return AgoraVideoView( controller: VideoViewController.remote( rtcEngine: agoraEngine, canvas: VideoCanvas(uid: _remoteUid), connection: RtcConnection(channelId: channelName), ), ); } else { return const Text( 'Waiting for a host to join', textAlign: TextAlign.center, ); } } }

    // Set the client role when a radio button is selected void _handleRadioValueChange(bool? value) async { setState(() { _isHost = (value == true); }); if (_isJoined) leave(); }

    @override Widget build(BuildContext context) { return MaterialApp( scaffoldMessengerKey: scaffoldMessengerKey, home: Scaffold( appBar: AppBar( title: const Text('Get started with Interactive Live Streaming'), ), body: ListView( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), children: [ // Container for the local video Container( height: 240, decoration: BoxDecoration(border: Border.all()), child: Center(child: _videoPanel()), ), // Radio Buttons Row(children: [ Radio( value: true, groupValue: _isHost, onChanged: (value) => _handleRadioValueChange(value), ), const Text('Host'), Radio( value: false, groupValue: _isHost, onChanged: (value) => _handleRadioValueChange(value), ), const Text('Audience'), ]), // Button Row Row( children: [ Expanded( child: ElevatedButton( child: const Text("Join"), onPressed: () => {join()}, ), ), const SizedBox(width: 10), Expanded( child: ElevatedButton( child: const Text("Leave"), onPressed: () => {leave()}, ), ), ], ), // Button Row ends ], )), ); } } `

    bug 
    opened by mohamedELamine 1
  • Hosting view in view hierarchy for platform view: 0 [BUG]

    Hosting view in view hierarchy for platform view: 0 [BUG]

    when I use agora Uikit, I found this Error E/FrameEvents(21365): updateAcquireFence: Did not find frame. this is code: import 'package:agora_uikit/agora_uikit.dart'; import 'package:flutter/material.dart';

    void main() { runApp(const MyApp()); }

    class MyApp extends StatefulWidget { const MyApp({super.key});

    @override State createState() => _MyAppState(); }

    class _MyAppState extends State { final AgoraClient client = AgoraClient( agoraConnectionData: AgoraConnectionData( appId: "My appId", channelName: "test", username: "user", ), enabledPermission: [Permission.camera, Permission.microphone], agoraChannelData: AgoraChannelData( channelProfileType: ChannelProfileType.channelProfileLiveBroadcasting, clientRoleType: ClientRoleType.clientRoleBroadcaster, ), );

    @override void initState() { super.initState(); initAgora(); }

    void initAgora() async { await client.initialize(); }

    @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Agora VideoUIKit'), centerTitle: true, ), body: SafeArea( child: Stack( children: [ AgoraVideoViewer( client: client, layoutType: Layout.floating, floatingLayoutContainerHeight: 100, floatingLayoutContainerWidth: 100, showNumberOfUsers: true, showAVState: true, enableHostControls: true, // Add this to enable host controls ), AgoraVideoButtons( client: client, enabledButtons: [ BuiltInButtons.toggleMic, BuiltInButtons.callEnd, BuiltInButtons.switchCamera ], ) ], ), ), ), ); } }

    bug 
    opened by mohamedELamine 2
Releases(1.0.4)
  • 1.0.4(Sep 27, 2022)

  • 1.0.3(Aug 9, 2022)

    • Updated permission_handler to 10.0.0. compileSdkVersion must be set to 33 as a minimum to handle the new notifications.
    • Fixes issue https://github.com/AgoraIO-Community/Flutter-UIKit/issues/98. Added onDisconnect function inside the AgoraVideoButtons widget that can be used to define any navigation or function that occurs when the end call button is pressed.
    • Fixes issue https://github.com/AgoraIO-Community/Flutter-UIKit/issues/96. Added a broadcaster check before adding a user view to the grid layout.

    When updating to version 1.0.3 make sure to update the android/app/build.gradle file and set the compileSdkVersion to 33.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(May 30, 2022)

  • 1.0.0(May 24, 2022)

  • 0.0.3(Sep 22, 2021)

  • 0.0.2(Jun 18, 2021)

Owner
Agora.io Community
For & by the community 🤓
Agora.io Community
A new video calling mobile application using Flutter, Agora SDK and GetX state management.

LiveBox : A Video Calling App A new video calling mobile application using Flutter, Agora SDK and GetX state management. Features Login Registration F

Nikhil Rajput 14 Dec 3, 2022
A Flutter widget that simply balances the lines of two-line text

Flutter Balanced Text ⚖️ A Flutter widget that simply balances the lines of two-line text, especially useful on long titles or short descriptions. Doe

Raşit Ayaz 3 Nov 10, 2022
A flutter package that helps you create an on-boarding screen for your project within minutes just by providing a few parameters.

A flutter package that helps you create an on-boarding screen for your project within minutes just by providing a few parameters.

Sachin Kr. Shukla 40 Sep 27, 2022
Dumbo - A collection of all dumb stuff at one place, this repo is to be maintained for people who just simply are taking break from huge stuff and practicing something.

dumbo A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this is

Krish Bhanushali 1 Jan 3, 2022
Agora - Highlight Active Speaker in a video call

Highlight Active Speaker in a video call When a meeting or video chat is complet

null 3 Nov 23, 2022
A flutter plugin about qr code or bar code scan , it can scan from file、url、memory and camera qr code or bar code .Welcome to feedback your issue.

r_scan A flutter plugin about qr code or bar code scan , it can scan from file、url、memory and camera qr code or bar code .Welcome to feedback your iss

PengHui Li 112 Nov 11, 2022
Flutter video compress - Generate a new file by compressed video, and provide metadata. Get video thumbnail from a video path, supports JPEG/GIF. To reduce app size not using FFmpeg in IOS.

flutter_video_compress Generate a new path by compressed video, Choose to keep the source video or delete it by a parameter. Get video thumbnail from

天海るり 179 Dec 8, 2022
Api Call Check flutter - A new Flutter project that demonstrates api calling and displays them in a scrollable list

api_fetch A new Flutter project that demonstrates api calling and displays them

Babish Shrestha 0 Jan 2, 2022
A flutter library for Agora Fastboard

Agora Fastboard Agora Fastboard SDK is the latest generation of the whiteboard SDK launched by Agora to help developers quickly build whiteboard appli

netless 5 Dec 5, 2022
Hive Wait provide a Hive repository to calling methods in the box as async.

Hive Wait provide a Hive repository to calling methods in the box as async.

Giáo Hồ 1 May 10, 2022
FlutterAgoraFirebaseVideoCall (Agora RTC, Bloc Pattern, Cubit, Firestore, Cloud Function, FCM)

Flutter Agora Fully Functional Video Call module Tech Stack Client: Dart, Flutter Server: Firebase firestore, Google cloud functions Techniques: *BloC

Youssef Elshiaty 39 Dec 16, 2022
A flutter app which calculate your heart beat and takes few inputs and predict whether you have heart disease or not.

Heart Care App ?? ?? ❤️ ⭐️ Features: ⚡️ Lets you sign up and login ⚡️ Montioring your heart failure risk and heart beat through charts ⚡️ View Medical

HINA KHADIM 8 Oct 31, 2022
This Crypto App is Simply Showing data and chart by using coin gecko api.

crypto_app This is Simple Crypto Currency analytics showing app using coingecko api. You Can Use this if you want to show simply crypto currency analy

null 2 Oct 7, 2022
Turtle graphics for Flutter. It simply uses a custom painter to draw graphics by a series of Logo-like commands.

flutter_turtle flutter_turtle is a simple implementation of turtle graphics for Flutter. It simply uses a custom painter to draw graphics by a series

Weizhong Yang a.k.a zonble 46 Dec 16, 2022
(RPG maker) Create RPG-style or similar games more simply with Flame.

Bonfire Build RPG games and similar with the power of FlameEngine! Bonfire is ideal for building games from the following perspectives: Test our onlin

Rafael Almeida Barbosa 787 Jan 7, 2023
Dart package for Async Data Loading and Caching. Combine local (DB, cache) and network data simply and safely.

Stock is a dart package for loading data from both remote and local sources. It is inspired by the Store Kotlin library.

xmartlabs 59 Dec 24, 2022
In this video we will learn how to Integrate NodeJS Login and Register API in our Flutter application using JWT Token Authentication.

Flutter Login & Register with Node JS Rest API In this video we will learn how to Integrate NodeJS Login and Register API in our Flutter application u

SnippetCoder 18 Nov 28, 2022
Flutter plugin for playing or streaming YouTube videos inline using the official iFrame Player API

Flutter plugin for playing or streaming YouTube videos inline using the official iFrame Player API. The package exposes almost all the API provided by iFrame Player API. So, it's 100% customizable.

Pratap Singh 0 May 15, 2022
Draw perfect freehand lines—in Flutter.

Draw perfect pressure-sensitive freehand lines. ?? A port of the perfect-freehand JavaScript library. Try out that demo. ?? Love this library? Conside

Steve Ruiz 186 Jan 2, 2023