Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactors AgoraClient's initialization #17

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ Your application can still run the voice call when it is switched to the backgro
## Usage

```dart
// First, instantiate the client
final AgoraClient client = AgoraClient(
agoraConnectionData: AgoraConnectionData(
appId: "<--Add Your App Id Here-->",
Expand All @@ -80,6 +81,10 @@ final AgoraClient client = AgoraClient(
],
);

// Then initialize it
await client.initialize();

// Finally, have fun ;)
@override
Widget build(BuildContext context) {
return MaterialApp(
Expand All @@ -97,7 +102,8 @@ Widget build(BuildContext context) {
}

```

> **NOTE**: You should properly handle errors and await for initialization before using it.
> Look the [example](example) for inspiration.

## UIKits

Expand Down
58 changes: 39 additions & 19 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,24 @@ class MyApp extends StatefulWidget {
}

class _MyAppState extends State<MyApp> {
final AgoraClient client = AgoraClient(
agoraConnectionData: AgoraConnectionData(
appId: "<--Add your App Id here-->",
channelName: "test",
),
enabledPermission: [
Permission.camera,
Permission.microphone,
],
);
AgoraClient client;
Future<void> futureInitialize;

@override
void initState() {
super.initState();
client = AgoraClient(
agoraConnectionData: AgoraConnectionData(
appId: "<--Add your App Id here-->",
channelName: "test",
),
enabledPermission: [
Permission.camera,
Permission.microphone,
],
);
futureInitialize = client.initialize();
}

@override
Widget build(BuildContext context) {
Expand All @@ -32,15 +40,27 @@ class _MyAppState extends State<MyApp> {
centerTitle: true,
),
body: SafeArea(
child: Stack(
children: [
AgoraVideoViewer(
client: client,
),
AgoraVideoButtons(
client: client,
),
],
child: FutureBuilder(
future: futureInitialize,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(child: Text("Coulnd't initialize AgoraClient."));
}
return Stack(
children: [
AgoraVideoViewer(
layoutType: Layout.floating,
client: client,
),
AgoraVideoButtons(
client: client,
),
],
);
},
),
),
),
Expand Down
32 changes: 26 additions & 6 deletions lib/src/agora_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ import 'package:permission_handler/permission_handler.dart';
/// [AgoraClient] is the main class in this UIKit. It is used to initialize our [RtcEngine], add the list of user permissions, define the channel properties and use extend the [RtcEngineEventHandler] class.
class AgoraClient {
static const MethodChannel _channel = MethodChannel('agora_uikit');
final AgoraConnectionData agoraConnectionData;
final List<Permission> enabledPermission;
final AgoraChannelData? agoraChannelData;
final AgoraEventHandlers? agoraEventHandlers;

static Future<String> getPlatformVersion() async {
final String version = await _channel.invokeMethod('getPlatformVersion');
Expand All @@ -29,13 +33,28 @@ class AgoraClient {
return _sessionController;
}

bool _initialized;

/// Useful to check if [AgoraClient] is ready for further usage
///
/// See `initialize()` to initialize it
bool get initialized => _initialized;

AgoraClient({
required AgoraConnectionData agoraConnectionData,
required List<Permission> enabledPermission,
AgoraChannelData? agoraChannelData,
AgoraEventHandlers? agoraEventHandlers,
}) {
_initAgoraRtcEngine(
required this.agoraConnectionData,
required this.enabledPermission,
this.agoraChannelData,
this.agoraEventHandlers,
}) : _initialized = false;

/// Must be called before further usage.
///
/// See `initialized` to check if it has been initialized already
Future<void> initialize() async {
if (_initialized) {
return;
}
await _initAgoraRtcEngine(
agoraConnectionData: agoraConnectionData,
enabledPermission: enabledPermission,
agoraChannelData: agoraChannelData,
Expand Down Expand Up @@ -66,5 +85,6 @@ class AgoraClient {
}

await _sessionController.joinVideoChannel();
_initialized = true;
}
}