Flutter实时聊天功能插件firestore_chat的使用

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

Flutter实时聊天功能插件firestore_chat的使用

开始使用

要开始使用Firebase,请参阅文档:https://firebase.flutter.dev/docs/overview

在项目中添加Firestore Chat插件,按照以下步骤操作:

import 'package:firestore_chat/firestore_chat.dart';

可以通过Material路由或直接推送聊天页面来打开聊天页面。

await openChatPage(BuildContext context, ChatEntity chatEntity);

或者

FirestoreChat().chatPageWidget(chatEntity)

示例

打开聊天

final chatEntity = ChatEntity(
    onMessageSent: (message, chatEntity){
    //
    },
    mainUser: mainUser,
    peers: peers,
    path: chatPath,
    title: "FIFA 2022 Games",
);

//方式一
Navigator.push(
    context,
    FirestoreChat().chatPageWidget(chatEntity),
);

//方式二
await openChatPage(context, chatEntity);
...

模型

Peer User

字段

  • id - 用户ID
  • image - 用户头像URL
  • name - 用户显示名称

Chat Entity

字段

  • mainUser - 登录用户
  • peers - 用户映射表 <user ID, PeerUser>
  • title - 聊天名称(可以为 nullable
  • path - 在Firestore中存储消息/聊天的位置
  • onMessageSent - 当消息保存到Firestore时的回调

许可证

问题与反馈

如果您有任何建议或发现任何问题,请随时在Github上提交问题进行讨论。


示例代码

// 忽略不必要的const

import 'package:firestore_chat/firestore_chat.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

import 'firebase_options.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(const MyApp());
}

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

  // 这个小部件是你的应用的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        DefaultCupertinoLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale('en', ''), // 英语
        Locale('ar', ''), // 阿拉伯语
      ],
      locale: const Locale('ar'), // 设置初始语言为阿拉伯语
      title: 'Firestore Chat Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        // Center 是一个布局小部件。它只接受一个子元素并将其置于父元素的中心。
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () => openChatFirst(context),
              child: const Text("Open Chat"),
            ),
            const SizedBox(height: 50),
            ElevatedButton(
              onPressed: () => openChatSecond(context),
              child: const Text("Open Chat"),
            ),
          ],
        ),
      ),
      // 这个逗号使得自动格式化更美观。
    );
  }

  // 直接方法调用打开聊天
  openChatFirst(context) async {
    final mainUser = PeerUser(id: "1", name: "User 1");
    final peers = {
      "1": mainUser,
      "2": PeerUser(id: "2", name: "User 2"),
      "3": PeerUser(id: "3", name: "User 3"),
      "4": PeerUser(id: "4", name: "User 4"),
      "5": PeerUser(id: "5", name: "User 5"),
    };

    final chatEntity = ChatEntity(
      mainUser: mainUser,
      peers: peers,
      path: "sport/football/2022/worldcup-1",
      title: "FIFA 2022 Games - Photo Sharing - 1",
      supportMedia: true,
      onMessageSent: (String message, ChatEntity chatEntity) {
        // 处理当聊天已发送到Firestore时的情况
        // 您可以使用它来发送通知或显示一个Toast/SnackBar
      },
    );

    await FirestoreChat().openChatPage(context, chatEntity);
  }

  // 通过导航路由打开聊天
  openChatSecond(context) async {
    final mainUser = PeerUser(id: "1", name: "User 1");
    final peers = {
      "1": mainUser,
      "2": PeerUser(id: "2", name: "User 2"),
      "3": PeerUser(id: "3", name: "User 3"),
      "4": PeerUser(id: "4", name: "User 4"),
      "5": PeerUser(id: "5", name: "User 5"),
    };

    final chatEntity = ChatEntity(
      mainUser: mainUser,
      peers: peers,
      path: "sport/football/2022/worldcup",
      title: "FIFA 2022 Games",
      onMessageSent: (String message, ChatEntity chatEntity) {
        // 处理当聊天已发送到Firestore时的情况
        // 您可以使用它来发送通知或显示一个Toast/SnackBar
      },
    );
    Navigator.push(
      context,
      FirestoreChat().chatPageWidget(chatEntity),
    );
  }
}

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

1 回复

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


当然,下面是一个使用 firestore_chat 插件在 Flutter 中实现实时聊天功能的代码示例。firestore_chat 是一个基于 Firebase Firestore 的聊天插件,它简化了在 Flutter 应用中实现实时聊天功能的复杂性。

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

dependencies:
  flutter:
    sdk: flutter
  firestore_chat: ^最新版本号  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,你需要设置 Firebase Firestore 数据库。确保你已经在 Firebase 控制台中创建了一个项目,并启用了 Firestore 数据库。然后,将你的 Firebase 配置添加到 Flutter 项目中,通常是在 lib/main.dart 文件的顶部:

import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:firestore_chat/firestore_chat.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

现在,我们可以开始构建聊天界面。以下是一个基本的聊天应用示例:

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

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

class ChatScreen extends StatefulWidget {
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final ChatController _chatController = ChatController(
    user: User(
      uid: '用户的UID',  // 替换为用户的唯一标识符
      name: '用户名',    // 替换为用户的显示名称
      avatarUrl: '用户的头像URL', // 替换为用户的头像URL
    ),
    roomId: '聊天室ID',  // 替换为特定的聊天室ID
    onNewMessage: (Message message) {
      // 处理新消息的逻辑,例如更新UI
      print('New message: ${message.text}');
    },
  );

  @override
  void dispose() {
    _chatController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('聊天室'),
      ),
      body: ChatRoom(
        controller: _chatController,
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final String text = await showDialog<String>(
            context: context,
            builder: (context) => AlertDialog(
              title: Text('发送消息'),
              content: TextField(
                autofocus: true,
                decoration: InputDecoration(border: InputBorder.none),
                onEditingComplete: () {
                  Navigator.of(context).pop(controller.text);
                },
              ),
              actions: <Widget>[
                TextButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: Text('取消'),
                ),
                TextButton(
                  onPressed: () {
                    Navigator.of(context).pop(controller.text);
                  },
                  child: Text('发送'),
                ),
              ],
            ),
          );
          if (text != null && text.trim().isNotEmpty) {
            _chatController.sendMessage(text);
          }
        },
        tooltip: '发送消息',
        child: Icon(Icons.send),
      ),
    );
  }
}

在这个示例中,我们创建了一个基本的聊天屏幕,其中包含了聊天室界面和一个浮动操作按钮用于发送消息。ChatController 被用来管理聊天逻辑,包括用户信息、聊天室ID以及新消息的回调。

请确保替换示例代码中的 '用户的UID''用户名''用户的头像URL''聊天室ID' 为实际的值。

这个示例展示了如何使用 firestore_chat 插件快速搭建一个基本的实时聊天功能。根据你的需求,你可以进一步自定义和扩展这个聊天界面。

回到顶部