init method
Future<void>
init({
- required String apiAddr,
- required String wsAddr,
- required String aesKey,
- OnConnListener? statusSink,
- 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;
}