Flutter实时通信插件socket_io_adapter的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter实时通信插件socket_io_adapter的使用

开始使用

首先,您需要在Flutter项目中添加socket_io_adapter插件。可以通过以下命令安装:

flutter pub add socket_io_adapter

接下来,请确保完整安装了socket_io_client插件,并参考相关文档解决可能出现的问题。

使用示例

以下是使用socket_io_adapter的基本示例代码:

import 'package:flutter/material.dart';
import 'package:socket_io_adapter/socket_io_adapter.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Socket IO Adapter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  SocketIOAdapter? socket;
  String? answear;
  String? listenAnswear;

  void onPressed() {
    // 发送事件并处理响应
    socket?.emit('event').then((response) {
      answear = response.data.toString();
    }).catchError((error) {
      if (error is SocketException) {
        answear = error.response.data.toString();
      } else {
        answear = error.toString();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Socket Adapter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(listenAnswear ?? 'ListenAnswear'),
            Text(answear ?? 'Press the button to get an answer'),
            ElevatedButton(
              onPressed: onPressed,
              child: const Text('Emit event'),
            )
          ],
        ),
      ),
    );
  }

  @override
  void initState() {
    // 初始化SocketIOAdapter
    socket = SocketIOAdapter.initializeOptions(SocketIOOptions(path: 'https://example.com:3000/'));
    socket?.checkResponse = (data) => data['status']['ok']; // 自定义检查响应的方法
    socket?.connect(); // 连接到服务器
    // 监听各种事件
    socket?.onAll({
      'disconnect': (data) => listenAnswear = 'Disconnected',
      'connect': (data) => listenAnswear = 'Connect',
      'error': (data) => listenAnswear = 'Error',
      'connect_error': (data) => listenAnswear = 'Connect Error',
      'your_event': (data) => listenAnswear = 'Your Event',
    });

    super.initState();
  }
}

发送数据(Emit)

您可以使用emit方法发送数据到服务器:

socket.emit('sendMessage', {'message' : 'hi'}).then((value) {
    this.value = value; // 处理成功响应
}).catchError((error) {
    print('Error: ${error}'); // 处理错误
});

Socket拦截器

您可以创建一个自定义的Socket拦截器来处理请求和响应:

class LoggerSocketInterceptor extends SocketInterceptor {
  @override
  SocketRequest onRequest(SocketRequest request) {
    print('On Request: ${[request.data, request.event]}'); // 打印请求信息
    return super.onRequest(request);
  }

  @override
  SocketResponse onResponse(SocketResponse response) {
    print('On Response: ${response.data}'); // 打印响应信息
    return super.onResponse(response);
  }

  @override
  void onError(error) {
    print(error); // 打印错误信息
    super.onError(error);
  }

  @override
  dynamic onEvent(event, data) {
    print('Event: ${[event, data]}'); // 打印事件信息
    super.onEvent(event, data);
  }
}

控制台输出示例:

On Request: [ 'sendMessage', {'message' : 'hi'} ]
On Response: { 'status': { 'ok': true }, 'data': { 'id': 'number', 'message': 'hi' } }
Event: [ 'reveiveMessage', { 'id': 'number', 'message': 'Hi!' } ]

更多关于Flutter实时通信插件socket_io_adapter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter实时通信插件socket_io_adapter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于在Flutter项目中使用socket_io_adapter插件来实现实时通信,这里提供一个简单的代码案例来展示如何集成和使用该插件。需要注意的是,socket_io_adapter可能并不是Flutter社区广泛认知的官方或主流插件名称,这里假设你是指使用socket_io_client_dart(一个流行的Dart/Flutter Socket.IO客户端库)来实现Socket.IO通信。

首先,确保你的Flutter项目中已经添加了socket_io_client_dart依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  socket_io_client_dart: ^2.0.0-beta.4 # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中实现Socket.IO客户端功能。以下是一个简单的示例代码,展示如何连接到Socket.IO服务器、发送和接收消息。

import 'package:flutter/material.dart';
import 'package:socket_io_client_dart/socket_io_client_dart.dart' as IO;

void main() {
  runApp(MyApp());
}

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

class SocketIOScreen extends StatefulWidget {
  @override
  _SocketIOScreenState createState() => _SocketIOScreenState();
}

class _SocketIOScreenState extends State<SocketIOScreen> {
  IO.Socket? socket;
  TextEditingController _messageController = TextEditingController();
  List<String> _messages = [];

  @override
  void initState() {
    super.initState();
    connectToSocket();
  }

  void connectToSocket() {
    String url = 'http://your-socket-io-server-url:port'; // 替换为你的Socket.IO服务器URL
    socket = IO.io(url, <String, dynamic>{
      'transports': ['websocket'],
    });

    socket!.onConnect((data) {
      print('Connected to socket server');
      _addMessage('Connected to server');
    });

    socket!.onDisconnect((data) {
      print('Disconnected from socket server');
      _addMessage('Disconnected from server');
    });

    socket!.on('message', (data) {
      print('Received message: $data');
      _addMessage('Server: $data');
    });

    socket!.onError((error) {
      print('Socket error: $error');
    });
  }

  void _sendMessage() {
    String message = _messageController.text;
    if (message.isNotEmpty) {
      socket!.emit('message', message);
      _addMessage('You: $message');
      _messageController.clear();
    }
  }

  void _addMessage(String message) {
    setState(() {
      _messages.add(message);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Socket.IO Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Expanded(
              child: ListView.builder(
                itemCount: _messages.length,
                itemBuilder: (context, index) {
                  return Padding(
                    padding: const EdgeInsets.symmetric(vertical: 4.0),
                    child: Text(_messages[index]),
                  );
                },
              ),
            ),
            TextField(
              controller: _messageController,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Enter message',
              ),
              onSubmitted: _sendMessage,
            ),
            ElevatedButton(
              onPressed: _sendMessage,
              child: Text('Send'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    socket?.disconnect();
    _messageController.dispose();
    super.dispose();
  }
}

在这个示例中:

  1. 我们首先添加了socket_io_client_dart依赖。
  2. SocketIOScreen组件中,我们初始化并连接到Socket.IO服务器。
  3. 我们处理了连接、断开连接和接收消息的事件。
  4. 用户可以通过UI发送消息到服务器,并接收来自服务器的消息。

请确保将url变量替换为你的Socket.IO服务器的实际URL和端口。这个示例展示了基本的实时通信功能,你可以根据需求进一步扩展和定制。

回到顶部