init method

Future<void> init({
  1. required String apiAddr,
  2. required String wsAddr,
  3. required String aesKey,
  4. OnConnListener? statusSink,
  5. String? acceptLanguage,
})

apiAddr HTTP Base,如 http://127.0.0.1:9501 wsAddr WS Base,如 ws://127.0.0.1:9502 statusSink 须在连通性回调生效前挂上,否则会漏掉状态事件

Implementation

Future<void> init({
  required String apiAddr,
  required String wsAddr,
  required String aesKey,
  OnConnListener? statusSink,
  String? acceptLanguage,
}) async {
  http.init(baseUrl: apiAddr, aesKey: aesKey, acceptLanguage: acceptLanguage);
  ws.init(wsBase: wsAddr, aesKey: aesKey, acceptLanguage: acceptLanguage);
  http.onTokenRefreshed = (token) {
    ws.setToken(token);
  };

  _statusSink = statusSink;

  connectivity.onNetworkLost = (prev) {
    GoChatLogger.d('network lost (${prev.label})');
    ws.onNetworkLost();
    _statusSink?.networkLost(prev);
    _statusSink?.networkChanged(NetworkType.none);
    emitImStatus(ImConnStatus.networkOffline);
  };

  connectivity.onNetworkRestored = (type) {
    GoChatLogger.d('network restored (${type.label}) → smart reconnect');
    _statusSink?.networkRestored(type);
    _statusSink?.networkChanged(type);
    ws.onNetworkRestored();
    if (!ws.isConnected) {
      emitImStatus(ImConnStatus.reconnecting);
    }
  };

  connectivity.onNetworkChanged = (type) {
    _statusSink?.networkChanged(type);
    if (!type.isOnline) {
      emitImStatus(ImConnStatus.networkOffline);
    } else {
      // wifi ↔ mobile 切换时,按当前 WS 状态重新对齐 IM 状态
      syncImStatus();
    }
  };

  await connectivity.start();
  ws.networkAvailable = connectivity.isOnline;

  // 推送初始综合状态(保证 onImConnStatusChanged 至少触发一次)
  syncImStatus(force: true);

  _initialized = true;
}