Skip to main content

Quick Start

Installation

pub package
dependencies:
  wukongimfluttersdk: ^version # Check version number above

Import

import 'package:wukongimfluttersdk/wkim.dart';

Basic Setup

1. Initialize SDK

Initialize the SDK in your app’s main function or during app startup:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // Initialize WuKongIM SDK
  await WKIM.shared.setup(
    uid: 'your_user_id',
    token: 'your_auth_token',
  );
  
  runApp(MyApp());
}

2. Configure Connection

Set up connection parameters and server information:
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    _initializeWuKongIM();
  }
  
  void _initializeWuKongIM() {
    // Configure server address
    WKIM.shared.connectionManager.setServerAddress('your-server.com', 5100);
    
    // Set connection options
    WKIM.shared.connectionManager.setOptions(
      heartbeatInterval: 30, // Heartbeat interval in seconds
      reconnectInterval: 5,  // Reconnect interval in seconds
      maxReconnectAttempts: 10, // Maximum reconnect attempts
    );
    
    // Listen for connection status
    WKIM.shared.connectionManager.addOnConnectionStatus('main', (status, reason, connInfo) {
      print('Connection status: $status, reason: $reason');
      _handleConnectionStatus(status, reason);
    });
    
    // Connect to server
    WKIM.shared.connectionManager.connect();
  }
  
  void _handleConnectionStatus(int status, String reason) {
    switch (status) {
      case WKConnectStatus.success:
        print('Connected successfully');
        break;
      case WKConnectStatus.connecting:
        print('Connecting...');
        break;
      case WKConnectStatus.disconnect:
        print('Disconnected');
        break;
      case WKConnectStatus.kicked:
        print('Kicked offline');
        _handleKickedOffline();
        break;
    }
  }
  
  void _handleKickedOffline() {
    // Handle being kicked offline
    // Redirect to login page or show notification
  }
  
  @override
  void dispose() {
    // Clean up listeners
    WKIM.shared.connectionManager.removeOnConnectionStatus('main');
    super.dispose();
  }
}

Advanced Configuration

1. Custom Configuration Options

class WuKongIMConfig {
  static void configure() {
    // Set debug mode
    WKIM.shared.setDebugMode(true);
    
    // Configure database options
    WKIM.shared.setDatabaseOptions(
      dbName: 'wukongim.db',
      dbPassword: 'your_db_password', // Optional encryption
    );
    
    // Configure file upload settings
    WKIM.shared.setFileUploadOptions(
      maxFileSize: 100 * 1024 * 1024, // 100MB
      allowedFileTypes: ['jpg', 'png', 'gif', 'mp4', 'mp3'],
      uploadTimeout: 60, // seconds
    );
    
    // Configure message options
    WKIM.shared.setMessageOptions(
      maxMessageLength: 5000,
      enableMessageReceipt: true,
      enableTypingIndicator: true,
    );
  }
}

2. Environment-Specific Setup

class EnvironmentConfig {
  static void setupForEnvironment() {
    if (kDebugMode) {
      // Development environment
      _setupDevelopment();
    } else {
      // Production environment
      _setupProduction();
    }
  }
  
  static void _setupDevelopment() {
    WKIM.shared.setDebugMode(true);
    WKIM.shared.connectionManager.setServerAddress('dev-server.com', 5100);
    WKIM.shared.setLogLevel(WKLogLevel.debug);
  }
  
  static void _setupProduction() {
    WKIM.shared.setDebugMode(false);
    WKIM.shared.connectionManager.setServerAddress('prod-server.com', 5100);
    WKIM.shared.setLogLevel(WKLogLevel.error);
  }
}

3. Permission Setup

Add necessary permissions to your platform-specific configuration files:

Android (android/app/src/main/AndroidManifest.xml)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

iOS (ios/Runner/Info.plist)

<key>NSCameraUsageDescription</key>
<string>This app needs access to camera to take photos</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app needs access to microphone to record audio</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to photo library to select images</string>

Complete Integration Example

import 'package:flutter/material.dart';
import 'package:wukongimfluttersdk/wkim.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // Initialize SDK
  await WuKongIMManager.initialize();
  
  runApp(MyApp());
}

class WuKongIMManager {
  static Future<void> initialize() async {
    try {
      // Setup SDK with user credentials
      await WKIM.shared.setup(
        uid: await _getUserId(),
        token: await _getAuthToken(),
      );
      
      // Configure SDK
      _configureSDK();
      
      // Setup listeners
      _setupGlobalListeners();
      
      print('WuKongIM SDK initialized successfully');
    } catch (e) {
      print('Failed to initialize WuKongIM SDK: $e');
    }
  }
  
  static void _configureSDK() {
    // Set debug mode based on build mode
    WKIM.shared.setDebugMode(kDebugMode);
    
    // Configure connection
    WKIM.shared.connectionManager.setServerAddress(
      _getServerAddress(),
      _getServerPort(),
    );
    
    // Set connection options
    WKIM.shared.connectionManager.setOptions(
      heartbeatInterval: 30,
      reconnectInterval: 5,
      maxReconnectAttempts: 10,
    );
  }
  
  static void _setupGlobalListeners() {
    // Connection status listener
    WKIM.shared.connectionManager.addOnConnectionStatus('global', (status, reason, connInfo) {
      _handleGlobalConnectionStatus(status, reason);
    });
    
    // Global message listener
    WKIM.shared.messageManager.addOnNewMsgListener('global', (messages) {
      _handleGlobalNewMessages(messages);
    });
    
    // Global conversation listener
    WKIM.shared.conversationManager.addOnRefreshMsgListener('global', (conversation, isEnd) {
      if (isEnd) {
        _handleConversationUpdate(conversation);
      }
    });
  }
  
  static void _handleGlobalConnectionStatus(int status, String reason) {
    switch (status) {
      case WKConnectStatus.success:
        print('Global: Connected successfully');
        break;
      case WKConnectStatus.kicked:
        print('Global: Kicked offline');
        _handleGlobalKickOff();
        break;
      case WKConnectStatus.disconnect:
        print('Global: Disconnected - $reason');
        break;
    }
  }
  
  static void _handleGlobalNewMessages(List<WKMsg> messages) {
    // Handle new messages globally (notifications, badges, etc.)
    for (var message in messages) {
      _showNotificationForMessage(message);
    }
  }
  
  static void _handleConversationUpdate(WKUIConversationMsg conversation) {
    // Update app badge count
    _updateAppBadge();
  }
  
  static void _handleGlobalKickOff() {
    // Handle being kicked offline
    // Clear user session and redirect to login
  }
  
  static void _showNotificationForMessage(WKMsg message) {
    // Show local notification for new message
  }
  
  static void _updateAppBadge() {
    // Update app icon badge with unread count
    final unreadCount = WKIM.shared.conversationManager.getAllUnreadCount();
    // Update badge using platform-specific code
  }
  
  // Helper methods
  static Future<String> _getUserId() async {
    // Get user ID from secure storage or preferences
    return 'user123';
  }
  
  static Future<String> _getAuthToken() async {
    // Get auth token from secure storage
    return 'auth_token_here';
  }
  
  static String _getServerAddress() {
    return kDebugMode ? 'dev-server.com' : 'prod-server.com';
  }
  
  static int _getServerPort() {
    return 5100;
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WuKongIM Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int _connectionStatus = WKConnectStatus.disconnect;
  
  @override
  void initState() {
    super.initState();
    _setupListeners();
    _connectToServer();
  }
  
  void _setupListeners() {
    WKIM.shared.connectionManager.addOnConnectionStatus('home', (status, reason, connInfo) {
      setState(() {
        _connectionStatus = status;
      });
    });
  }
  
  void _connectToServer() {
    WKIM.shared.connectionManager.connect();
  }
  
  @override
  void dispose() {
    WKIM.shared.connectionManager.removeOnConnectionStatus('home');
    super.dispose();
  }
  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('WuKongIM Demo'),
        actions: [
          Icon(
            _connectionStatus == WKConnectStatus.success
                ? Icons.wifi
                : Icons.wifi_off,
            color: _connectionStatus == WKConnectStatus.success
                ? Colors.green
                : Colors.red,
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Connection Status: ${_getStatusText(_connectionStatus)}'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _connectionStatus == WKConnectStatus.success
                  ? null
                  : _connectToServer,
              child: Text('Connect'),
            ),
          ],
        ),
      ),
    );
  }
  
  String _getStatusText(int status) {
    switch (status) {
      case WKConnectStatus.success:
        return 'Connected';
      case WKConnectStatus.connecting:
        return 'Connecting';
      case WKConnectStatus.disconnect:
        return 'Disconnected';
      case WKConnectStatus.kicked:
        return 'Kicked Offline';
      default:
        return 'Unknown';
    }
  }
}

Next Steps

Basic Features

Learn connection management and basic API usage

Message Management

Explore message sending and receiving functionality

Conversation Management

Handle conversation lists and unread messages

Advanced Features

Discover custom messages and extension features