简单使用Flutter实现聊天

简介: Flutter 实现聊天的方式有很多种,这里提供一种简单的实现方式

Flutter 实现聊天的方式有很多种,这里提供一种简单的实现方式:

1.使用 Flutter 中提供的 WebSocket API 进行实时通信; 2.使用 Flutter 中提供的 Stream API 监听 WebSocket 的数据流; 3.将接收到的消息渲染到列表中。

下面是代码示例:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:web_socket_channel/io.dart';
class ChatPage extends StatefulWidget {
  const ChatPage({Key? key}) : super(key: key);
  @override
  _ChatPageState createState() => _ChatPageState();
}
class _ChatPageState extends State<ChatPage> {
  TextEditingController _textController = TextEditingController();
  IOWebSocketChannel? _channel;
  List<String> _messages = [];
  @override
  void initState() {
    super.initState();
    _connect();
  }
  void _connect() {
    _channel = IOWebSocketChannel.connect('ws://localhost:3000');
    _channel?.stream.listen((message) {
      setState(() {
        _messages.add(message);
      });
    });
  }
  void _sendMessage(String text) {
    if (text.isNotEmpty) {
      _channel?.sink.add(jsonEncode({'message': text}));
      _textController.clear();
    }
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter Chat'),
      ),
      body: Column(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
              itemCount: _messages.length,
              itemBuilder: (BuildContext context, int index) {
                return ListTile(
                  title: Text(_messages[index]),
                );
              },
            ),
          ),
          Container(
            padding: const EdgeInsets.symmetric(horizontal: 8.0),
            child: Row(
              children: <Widget>[
                Expanded(
                  child: TextField(
                    controller: _textController,
                    decoration:
                        const InputDecoration(hintText: 'Enter a message'),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.send),
                  onPressed: () {
                    _sendMessage(_textController.text);
                  },
                )
              ],
            ),
          )
        ],
      ),
    );
  }
  @override
  void dispose() {
    _channel?.sink.close();
    super.dispose();
  }
}

在这个示例中,我们通过 WebSocket 连接到本地服务器,并使用 JSON 编码消息。_connect() 方法连接到 WebSocket,_sendMessage() 方法将消息发送到服务器。Flutter 的 StreamBuilder 可以使 UI 响应数据流变得更简单。

相关文章
|
2月前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
2月前
|
缓存 前端开发 数据安全/隐私保护
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
【4月更文挑战第30天】本文探讨了Flutter中键盘处理与输入框优化的关键技术,包括监听键盘显示隐藏、焦点管理、键盘类型适配、输入框高度自适应、处理键盘遮挡问题及性能优化。通过使用WidgetsBindingObserver、FocusNode和TextInputType等工具,开发者能提升用户体验,确保输入框在各种场景下的良好表现。实例分析和实践建议有助于开发者将这些方法应用于实际项目。
【Flutter 前端技术开发专栏】Flutter 中的键盘处理与输入框优化
|
10月前
|
人机交互
Flutter笔记 - ListTile组件及其应用
Flutter笔记 - ListTile组件及其应用
157 0
|
2月前
|
存储 开发工具 git
Flutter笔记:关于Flutter中的大文件上传(上)
Flutter笔记:关于Flutter中的大文件上传(上)
172 0
|
2月前
Flutter笔记:使用Flutter构建响应式PC客户端/Web页面-案例
Flutter笔记:使用Flutter构建响应式PC客户端/Web页面-案例
99 0
|
2月前
|
SQL Dart 数据库
Flutter笔记: 在Flutter应用中使用SQLite数据库
Flutter笔记: 在Flutter应用中使用SQLite数据库
400 0
|
2月前
|
Dart Android开发
flutter笔记:使用flutter webvie
flutter笔记:使用flutter webvie
28 0
|
2月前
|
存储 网络安全 数据库
flutter怎样使用阿里云开发服务?
flutter怎样使用阿里云开发服务?
128 2
|
9月前
|
存储 缓存 编解码
Flutter笔记:图片的 precacheImage 函数
precacheImage 是 Flutter 中提供的一个函数。顾名思义,pre预先、cache缓存、Image图片,很容易看出 precacheImage 函数用于预加载图像并将其缓存到图像缓存中。这个函数是非常有用的,因为它可以在用户实际需要显示图像之前,提前将图像加载到内存中,以提高图像的加载速度。这对于提供更好的用户体验和性能非常重要,特别是当项目中有多个图像需要显示时。
105 0
|
Web App开发 Dart 数据挖掘
它来了!Flutter3.0发布全解析
它来了!Flutter3.0发布全解析
335 0
它来了!Flutter3.0发布全解析

相关实验场景

更多