andrew_im_sdk 0.1.22
andrew_im_sdk: ^0.1.22 copied to clipboard
Andrew IM SDK for Flutter — HTTP + WebSocket client for real-time messaging, conversations, groups, audio/video calls and more.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:andrew_im_sdk/andrew_im_sdk.dart' as im;
/// andrew_im_sdk 最小使用示例:初始化 → 连接 → 发消息 → 监听事件。
///
/// 运行前请替换下方 baseUrl / token / tenantId / userId / peerId 为真实值。
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'IM SDK Demo',
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final _client = im.AndrewIMClient(autoReconnect: true);
final List<String> _logs = [];
String _connState = 'disconnected';
void _log(String s) {
setState(() {
_logs.insert(0, '${DateTime.now().toIso8601String().substring(11, 19)} $s');
});
}
Future<void> _connect() async {
_client.addListener(_DemoListener(_log, (s) => setState(() => _connState = s.name)));
_log('init...');
await _client.init(
baseUrl: 'https://your-im-gateway.example.com',
token: 'YOUR_TOKEN',
tenantId: 'YOUR_TENANT',
userId: 'YOUR_USER_ID',
deviceId: 'demo-device',
platform: 'flutter',
);
_log('connect...');
await _client.connect();
}
Future<void> _send() async {
try {
await _client.messageManager!.sendMessage(im.SendMessageRequest(
targetId: 'peer-user-id',
targetType: im.MessageTargetType.user,
type: im.MessageType.text,
content: 'Hello from example!',
));
_log('message sent');
} catch (e) {
_log('send error: $e');
}
}
@override
void dispose() {
_client.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('IM SDK Demo'),
actions: [
Padding(
padding: const EdgeInsets.all(16),
child: Center(child: Text(_connState, style: const TextStyle(fontSize: 12))),
),
],
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(8),
child: Row(
children: [
ElevatedButton(onPressed: _connect, child: const Text('Connect')),
const SizedBox(width: 8),
ElevatedButton(onPressed: _send, child: const Text('Send')),
],
),
),
const Divider(),
Expanded(
child: ListView.builder(
itemCount: _logs.length,
itemBuilder: (_, i) => ListTile(
dense: true,
title: Text(_logs[i], style: const TextStyle(fontSize: 12)),
),
),
),
],
),
);
}
}
class _DemoListener extends im.IMEventListener {
_DemoListener(this.log, this.onState);
final void Function(String) log;
final void Function(im.ConnectionState) onState;
@override
void onNewMessage(im.IMMessage m) => log('new message: ${m.id}');
@override
void onConnectionStateChanged(im.ConnectionState s) {
onState(s);
log('state: ${s.name}');
}
@override
void onKicked(im.KickedEvent e) => log('kicked: ${e.reason}');
}