Flutter即时通讯插件superchat的使用

Flutter即时通讯插件superchat的使用

Super Chat

  • 一个基于实时数据库的高度可扩展且完整的聊天应用程序。
  • 这个插件特别为FlutterFlow开发者设计。
    • 如果你正在寻找一个适用于Flutter的包,请查找easychat包。

特性

初始化

在你的FlutterFlow项目中的main.dart文件里调用ChatService.instance.init()方法。

  • databaseURL 必须设置为在Web平台上使用的实时数据库。

示例:

import 'package:superchat/superchat.dart';

Future initSuperchat() async {
  ChatService.instance.init(
    /// 提供Web平台的databaseURL
    databaseURL: "https://firebase-database-url.com",
  );
}

自定义组件

使用FF(假设FF是某种工具或框架)。

概述

  • 该包使用实时数据库。
    • 它非常
      • 经济实惠
      • 简单
      • 快速

如何使用

聊天室列表自定义设计

组件

ValueListView

使用此组件来列出实时数据库中节点的值。这可以处理大多数情况下列出节点值的情况。

  • 如果不调用fetchMore(index),它将只获取数据的第一页。
  • 如果只想显示最新或最旧的第一页,则无需调用fetchMore
  • 在此示例中,它使用PageView来列出数据。你可以使用ListViewGridViewCarouselView,或者甚至是ColumnRow等。

示例:

ValueListView(
  query: FirebaseDatabase.instance.ref('/tmp'),
  pageSize: 3,
  builder: (snapshot, fetchMore) {
    return PageView.builder(
      itemCount: snapshot.docs.length,
      itemBuilder: (context, index) {
        print('index: $index');
        fetchMore(index);
        return ListTile(
          contentPadding: const EdgeInsets.all(64),
          title: Text(snapshot.docs[index].key!),
        );
      },
    );
  },
  errorBuilder: (s) => Text('Error: $s'),
  loadingBuilder: () => const CircularProgressIndicator(),
  emptyBuilder: () => const Text('Empty'),
),

反向查询示例

ValueListView(
  query: FirebaseDatabase.instance.ref('/tmp'),
  pageSize: 3,
  reverseQuery: true,
  builder: (snapshot, fetchMore) {
    return ListView.builder(
      itemCount: snapshot.docs.length,
      itemBuilder: (context, index) {
        print('index: $index');
        fetchMore(index);
        return ListTile(
          contentPadding: const EdgeInsets.all(64),
          title: Text(snapshot.docs[index].key!),
        );
      },
    );
  },
  errorBuilder: (s) => Text('Error: $s'),
  loadingBuilder: () => const CircularProgressIndicator(),
  emptyBuilder: () => const Text('Empty'),
),

UserService

初始化

ChatService初始化时,UserService会自动将用户数据镜像到实时数据库。

ChatService.instance.init(
  userCollectionName: 'users',
  userPrivateFields: ['email', 'name'],
);
  • userPrivateFields 是那些不对外公开的字段。这些字段在镜像用户数据到实时数据库时会被排除在外。

完整示例Demo

以下是一个完整的示例代码,展示了如何初始化和使用superchat插件。

import 'package:example/firebase_options.dart';
import 'package:example/screens/chat/chat_room.list.screen.dart';
import 'package:example/screens/user/profile.screen.dart';
import 'package:example/screens/user/sign_in.screen.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:superchat/superchat.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);

  /// 初始化super chat服务
  ChatService.instance.init(
    /// 提供Web平台的databaseURL
    databaseURL: DefaultFirebaseOptions.currentPlatform.databaseURL!,
    debug: true,
  );
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Super chat'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'Sign in first before using chat feature',
            ),
            StreamBuilder(
                stream: FirebaseAuth.instance.authStateChanges(),
                builder: (context, snapshot) {
                  final user = FirebaseAuth.instance.currentUser;
                  if (user != null) {
                    return Column(
                      children: [
                        ElevatedButton(
                          onPressed: () {
                            FirebaseAuth.instance.signOut();
                          },
                          child: Text('UID: $myUid  Sign out'),
                        ),
                        ElevatedButton(
                          onPressed: () {
                            showGeneralDialog(
                              context: context,
                              pageBuilder: (_, __, ___) {
                                return const ProfileScreen();
                              },
                            );
                          },
                          child: const Text('Profile'),
                        )
                      ],
                    );
                  }
                  return ElevatedButton(
                    onPressed: () {
                      showGeneralDialog(
                        context: context,
                        pageBuilder: (_, __, ___) {
                          return const SignInScreen();
                        },
                      );
                    },
                    child: const Text('Sign in'),
                  );
                }),
            const Text(
              'Chat room menus:',
            ),
            ElevatedButton(
              onPressed: () {
                showGeneralDialog(
                  context: context,
                  pageBuilder: (_, __, ___) {
                    return const ChatRoomListScreen();
                  },
                );
              },
              child: const Text('Chat room list'),
            ),
            ElevatedButton(
              onPressed: () {
                showGeneralDialog(
                  context: context,
                  pageBuilder: (_, __, ___) {
                    return const ChatRoomListScreen();
                  },
                );
              },
              child: const Text('Chat Invitations'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


superchat 是一个用于 Flutter 的即时通讯插件,它可以帮助开发者快速集成聊天功能到 Flutter 应用中。以下是如何使用 superchat 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 superchat 插件的依赖:

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

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

2. 初始化插件

在你的 Flutter 应用中初始化 superchat 插件。通常,你可以在 main.dart 文件中进行初始化:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 Superchat
  await Superchat.initialize(
    appId: 'YOUR_APP_ID', // 替换为你的应用ID
    apiKey: 'YOUR_API_KEY', // 替换为你的API密钥
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Superchat Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ChatScreen(),
    );
  }
}

3. 创建聊天界面

接下来,你可以创建一个聊天界面,使用 superchat 提供的组件来显示聊天消息、发送消息等。

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

class ChatScreen extends StatefulWidget {
  [@override](/user/override)
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final TextEditingController _controller = TextEditingController();
  List<Message> _messages = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    // 监听新消息
    Superchat.onMessageReceived.listen((message) {
      setState(() {
        _messages.add(message);
      });
    });
  }

  void _sendMessage() async {
    if (_controller.text.isNotEmpty) {
      Message message = Message(
        text: _controller.text,
        senderId: 'user1', // 替换为当前用户的ID
        receiverId: 'user2', // 替换为接收者的ID
        timestamp: DateTime.now(),
      );

      await Superchat.sendMessage(message);
      _controller.clear();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chat'),
      ),
      body: Column(
        children: [
          Expanded(
            child: ListView.builder(
              itemCount: _messages.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(_messages[index].text),
                  subtitle: Text(_messages[index].senderId),
                );
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _controller,
                    decoration: InputDecoration(
                      hintText: 'Type a message...',
                    ),
                  ),
                ),
                IconButton(
                  icon: Icon(Icons.send),
                  onPressed: _sendMessage,
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}
回到顶部