Orientação gerada a partir de informações públicas. Apenas para referência.
Uma implementação em Dart do cliente Socket.IO, permitindo comunicação em tempo real e bidirecional entre aplicativos Flutter e servidores. Suporta protocolos WebSocket em múltiplas plataformas, incluindo Android, iOS, Web, macOS, Windows e Linux. Este pacote facilita interações baseadas em eventos, como atualizações em tempo real, aplicativos de chat e sincronização de dados em tempo real. Projetado para integração perfeita com servidores Socket.IO existentes, oferece uma API simples para conexão, emissão de eventos e escuta de respostas do servidor. Ideal para desenvolvedores que criam aplicações interativas e responsivas que exigem comunicação de baixa latência.
Casos de uso
Aplicações de bate-papo em tempo real
painéis de dados ao vivo
Sincronização de jogo multiplayer
monitoramento de dispositivos IoT
Ferramentas de edição colaborativa
Principais recursos
Suporte de WebSocket multiplataforma
Comunicação orientada por eventos
Reconexão automática
Gerenciamento de namespace e sala
API simples para emitir e ouvir
Compatibilidade com servidores Socket.IO
Indicado para
Desenvolvimento de aplicativos em tempo real
Aplicativos web e móveis interativos
Transmissão de eventos servidor-cliente
Aplicações que exigem atualizações de baixa latência
Desenvolvedores usando Socket.IO no backend
Considerações
Requer servidor Socket.IO compatível
Pode ser necessário tratamento adicional de erros para problemas de rede
O desempenho depende da confiabilidade do servidor
Não adequado para cenários de alta taxa de transferência sem otimização
Documentação limitada em comparação com bibliotecas maduras
README original
Snapshot do README original do repositório-fonte vinculado. Consulte o repositório para o conteúdo mais recente.
To connect the socket manually, set the option autoConnect: false and call .connect().
For example,
Socket socket = io('http://localhost:3000',
OptionBuilder()
.setTransports(['websocket']) // for Flutter or Dart VM
.disableAutoConnect() // disable auto-connection
.setExtraHeaders({'foo': 'bar'}) // optional
.build()
);
socket.connect();
Note that .connect() should not be called if autoConnect: true
(by default, it's enabled to true), as this will cause all event handlers to get registered/fired twice. See Issue #33.
Update the extra headers
Socket socket = ... // Create socket.
socket.io.options['extraHeaders'] = {'foo': 'bar'}; // Update the extra headers.
socket.io..disconnect()..connect(); // Reconnect the socket manually.
Custom WebSocket connector
Use setWebSocketConnector to plug in a custom WebSocket implementation — for
example CupertinoWebSocket/OkHttpWebSocket from package:cupertino_http /
package:cronet_http, or a dart:ioHttpClient with custom TLS/proxy
settings. The connector receives the extraHeaders you set via setExtraHeaders
(forwarded on native; browsers cannot send custom headers on the WebSocket
handshake, so they are ignored there).
HttpClientAdapter and OptionBuilder.setHttpClientAdapter() are deprecated
since 3.1.6 and will be removed in 4.0.0. (They were unintentionally dropped in
3.1.5 — see #442 —
and restored as deprecated shims to keep ^3.1.x builds compiling.) Replace them
with setWebSocketConnector. To keep using a custom dart:ioHttpClient on
native (e.g. for self-signed certificates or a proxy), add web_socket to your
dependencies and wrap the socket with IOWebSocket.fromWebSocket:
import'dart:io';
import'package:web_socket/io_web_socket.dart';
// Before (deprecated):// io('http://localhost:3000',// OptionBuilder().setHttpClientAdapter(myAdapter).build());// After:Socket socket = io('http://localhost:3000',
OptionBuilder()
.setTransports(['websocket'])
.setWebSocketConnector((uri, {protocols, headers}) async {
final raw = awaitWebSocket.connect(
uri.toString(),
protocols: protocols,
headers: headers,
customClient: myHttpClient, // your custom dart:io HttpClient
);
returnIOWebSocket.fromWebSocket(raw);
})
.build());
constList EVENTS = [
'connect',
'connect_error',
'disconnect',
'error',
'reconnect',
'reconnect_attempt',
'reconnect_failed',
'reconnect_error',
'ping',
'pong'
];
// Replace 'onConnect' with any of the above events.
socket.onConnect((_) {
print('connect');
});
Acknowledge with the socket server that an event has been received
socket.on('eventName', (data) {
final dataList = data asList;
final ack = dataList.last asFunction;
ack(null);
});
Usage (Flutter)
In Flutter env. not (Flutter Web env.) it only works with dart:io websocket,
not with dart:html websocket or Ajax (XHR), so in this case
you have to add setTransports(['websocket']) when creates the socket instance.
For example,
IO.Socket socket = IO.io('http://localhost:3000',
OptionBuilder()
.setTransports(['websocket']) // for Flutter or Dart VM
.setExtraHeaders({'foo': 'bar'}) // optional
.build());
Usage with stream and StreamBuilder in Flutter
import'dart:async';
// STEP1: Stream setupclassStreamSocket{
final _socketResponse= StreamController<String>();
voidFunction(String) get addResponse => _socketResponse.sink.add;
Stream<String> get getResponse => _socketResponse.stream;
voiddispose(){
_socketResponse.close();
}
}
StreamSocket streamSocket =StreamSocket();
//STEP2: Add this function in main function in main.dart file and add incoming data to the streamvoidconnectAndListen(){
IO.Socket socket = IO.io('http://localhost:3000',
OptionBuilder()
.setTransports(['websocket']).build());
socket.onConnect((_) {
print('connect');
socket.emit('msg', 'test');
});
//When an event received from server, data is added to the stream
socket.on('event', (data) => streamSocket.addResponse);
socket.onDisconnect((_) => print('disconnect'));
}
//Step3: Build widgets with StreamBuilderclassBuildWithSocketStreamextendsStatelessWidget{
constBuildWithSocketStream({Key key}) : super(key: key);
@overrideWidgetbuild(BuildContext context) {
returnContainer(
child: StreamBuilder(
stream: streamSocket.getResponse ,
builder: (BuildContext context, AsyncSnapshot<String> snapshot){
returnContainer(
child: snapshot.data,
);
},
),
);
}
}
Important Notice: Handling Socket Cache and subsequent lookups
There is a design decision in the baseline IO lookup command related to the caching of socket instances.
Lookup protocol
We reuse the existing instance based on same scheme/port/host.
It is important to make clear that both dispose() and destroy() do NOT remove a host from the cache of known connections. This can cause attempted
subsequent connections to ignore certain parts of your configuration if not handled correctly. You must handle this by using the options
available in the OptionBuilder during the first creation of the instance.
Examples
In the following example, there is a userId and username set as extra headers for this connection.
If you were to try and create the same connection with updated values, if the host is the same, the extra headers will not be updated and the old
connection would be returned.
In order to prevent this, depending on your application's needs, you can either use enableForceNew() or disableMultiplex() to the
option builder. These options would modify all connections using the same host, so be aware and plan accordingly.
An additional option, if it fits your use case, would be to follow the usage mentioned above in Update the extra headers.
By updating the extra headers outside of the building of the options, you can guarantee that your connections will have the values you are expecting.
Troubleshooting
Cannot connect "https" server or self-signed certificate server