Flutter即时通讯插件firebase_chat的使用
Flutter即时通讯插件firebase_chat的使用
Firebase Chat🔥💬
⛏️ 开始使用
要开始使用 Firebase,请参阅文档:https://firebase.flutter.dev/docs/overview
在项目中添加 Firebase Chat 插件,按照安装页面的说明进行操作并开始使用:
import 'package:firebase_chat/firebase_chat.dart';
📱 示例
扩展 StatefulWidget
class ChatPage extends BaseChat {
ChatPage({
required ChatEntity entity,
}) : super(entity);
[@override](/user/override)
_ChatPageState createState() => _ChatPageState();
}
class _ChatPageState extends BaseChatState<ChatPage> {
...
}
覆盖方法和属性
您可以查看示例文件:https://pub.dev/packages/firebase_chat/example
Widget inputBuilder(BuildContext context, ChatInputState state);
Future editAndUpload(Uint8List data);
Future getImage();
Widget get emptyWidget;
Widget get errorWidget;
Widget get loadingWidget;
Color get primaryColor;
Color get secondaryColor;
模型 📦
Peer User 👨
字段
id
- 用户IDimage
- 用户头像URLname
- 用户显示名称
构造函数
PeerUser({this.id, this.image, this.name})
PeerUser.fromSnapshot(DocumentSnapshot<Map<String, dynamic>> snap)
Chat Entity 📩
字段
mainUser
- 登录用户peers
- 用户映射<用户ID, PeerUser>
lastMessage
- 最后发送的消息title
- 聊天名称(可以为空)
许可证 ⚖️
- MIT
问题与反馈 💭
如果您有任何功能建议或遇到问题,请随时在 https://github.com/tedcrimson/firebase_chat/issues 提交 issue。
示例代码
以下是完整的示例代码,展示如何使用 firebase_chat
插件:
import 'package:firebase_chat/firebase_chat.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/services.dart';
import 'dart:typed_data';
import 'package:draw_page/draw_page.dart';
import 'package:flutter/foundation.dart';
import 'package:camera_capture/camera_capture.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Firebase Chat Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
[@override](/user/override)
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Map<String, PeerUser> peers = {
'myId': PeerUser(documentId: 'myId', name: 'Grievous'),
'otherId': PeerUser(
documentId: 'otherId',
name: 'Kenobi',
image:
'https://cdn.vox-cdn.com/thumbor/SRwHbaTMxPr4f8EJdfai_UR2y34=/1400x1050/filters:format(jpeg)/cdn.vox-cdn.com/uploads/chorus_asset/file/6434955/obi-wan.0.jpg'),
};
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ChatPage(
ChatEntity(
mainUser: peers['myId'],
peers: peers,
path: 'Chats/chatId',
title: peers['otherId'].name, // 也可以设置为群组名称
),
));
}
}
class ChatPage extends BaseChat {
ChatPage(ChatEntity entity) : super(entity);
[@override](/user/override)
_ChatPageState createState() => _ChatPageState();
}
class _ChatPageState extends BaseChatState<ChatPage> {
[@override](/user/override)
Color get primaryColor => Colors.blue;
[@override](/user/override)
Color get secondaryColor => Colors.blue;
[@override](/user/override)
Widget get loadingWidget => Center(
child: Padding(
padding: const EdgeInsets.all(30.0),
child: CircularProgressIndicator(),
),
);
[@override](/user/override)
Widget get emptyWidget => Center(
child: Padding(
padding: const EdgeInsets.all(40.0),
child: Text("Welcome"),
),
);
[@override](/user/override)
Widget errorWidget(String error) => Center(child: Text(error));
[@override](/user/override)
Future editAndUpload(Uint8List data) async {
Uint8List edited = await Navigator.of(context).push<Uint8List>(
MaterialPageRoute(builder: (BuildContext context) {
return DrawPage(imageData: data, loadingWidget: loadingWidget);
}),
);
sendImage(edited);
}
[@override](/user/override)
Future getImage() async {
List<Uint8List> images;
images = await Navigator.of(context).push<List<Uint8List>>(
MaterialPageRoute(builder: (BuildContext context) => CameraPage()),
);
if (images != null && images.length == 1) {
Uint8List image = await Navigator.of(context).push<Uint8List>(
MaterialPageRoute(builder: (BuildContext context) {
return DrawPage(imageData: images[0], loadingWidget: loadingWidget);
}),
);
if (image == null) return null;
images = [image];
}
if (images != null) {
for (var image in images) {
await sendImage(image);
}
}
}
[@override](/user/override)
Widget inputBuilder(BuildContext context, ChatInputState state) {
return SafeArea(
bottom: true,
top: false,
child: Container(
color: Colors.white,
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Expanded(
child: Container(
padding: EdgeInsets.all(10),
child: TextField(
onSubmitted: (text) {
if (text.isNotEmpty) sendMessage();
},
autofocus: false,
maxLines: null,
keyboardType: TextInputType.text,
style: TextStyle(fontSize: 20.0),
controller: textEditingController,
onChanged: inputChanged,
decoration: InputDecoration.collapsed(
hintText: "Type here",
hintStyle: TextStyle(color: Colors.grey),
),
),
),
),
if (state is InputEmptyState && !kIsWeb) // 不支持web
Material(
child: new Container(
child: new IconButton(
icon: new Icon(Icons.add_a_photo),
onPressed: () => getImage(),
color: primaryColor,
disabledColor: Colors.grey,
),
),
color: Colors.white,
),
// 发送消息按钮
Material(
child: new Container(
margin: new EdgeInsets.only(right: 4.0),
child: new IconButton(
icon: new Icon(Icons.send),
onPressed: state is ReadyToSendState ? sendMessage : null,
color: primaryColor,
disabledColor: Colors.grey,
),
),
color: Colors.white,
),
],
),
),
);
}
}
更多关于Flutter即时通讯插件firebase_chat的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter即时通讯插件firebase_chat的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中实现即时通讯功能,firebase_chat
是一个常用的插件,它基于 Firebase 实时数据库或 Firestore 来构建聊天应用。以下是如何使用 firebase_chat
插件的基本步骤:
1. 创建 Firebase 项目
首先,你需要在 Firebase 控制台中创建一个项目,并将其与你的 Flutter 应用关联。具体步骤如下:
- 访问 Firebase 控制台。
- 点击“添加项目”并按照提示创建新项目。
- 在项目设置中,添加你的 Flutter 应用(Android 和/或 iOS)。
- 下载
google-services.json
(Android)或GoogleService-Info.plist
(iOS)文件,并将其放入你的 Flutter 项目中。
2. 添加依赖
在你的 pubspec.yaml
文件中添加 firebase_core
和 firebase_chat
依赖:
dependencies:
flutter:
sdk: flutter
firebase_core: latest_version
firebase_chat: latest_version
然后运行 flutter pub get
以安装依赖。
3. 初始化 Firebase
在你的 main.dart
文件中初始化 Firebase:
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Chat',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ChatScreen(),
);
}
}
4. 创建聊天界面
在你的 ChatScreen
中,使用 firebase_chat
插件来发送和接收消息:
import 'package:firebase_chat/firebase_chat.dart';
import 'package:flutter/material.dart';
class ChatScreen extends StatefulWidget {
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final FirebaseChat _chat = FirebaseChat();
final TextEditingController _controller = TextEditingController();
List<ChatMessage> _messages = [];
@override
void initState() {
super.initState();
_chat.messagesStream.listen((messages) {
setState(() {
_messages = messages;
});
});
}
void _sendMessage() {
if (_controller.text.isNotEmpty) {
_chat.sendMessage(_controller.text);
_controller.clear();
}
}
@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: 'Enter your message',
),
),
),
IconButton(
icon: Icon(Icons.send),
onPressed: _sendMessage,
),
],
),
),
],
),
);
}
}
5. 配置 Firebase 数据库
在 Firebase 控制台中,启用实时数据库或 Firestore,并配置规则以允许读写操作。
对于实时数据库,规则可能如下:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
对于 Firestore,规则可能如下:
service cloud.firestore {
match /databases/{database}/documents {
match /messages/{message} {
allow read, write: if request.auth != null;
}
}
}
6. 运行应用
现在你可以运行你的 Flutter 应用,并测试聊天功能。你可以通过不同的用户登录来发送和接收消息。
7. 用户认证(可选)
为了使聊天功能更完整,你可以集成 Firebase 用户认证。例如,使用 firebase_auth
插件来实现用户登录和注册。
dependencies:
firebase_auth: latest_version