๐ฐFlutter์ ZEGOCLOUD ZIMKit์ ์ฌ์ฉํด ์ค์๊ฐ ์ฑํ ์ฑ ๋ง๋ค๊ธฐ (๋ฐฑ์๋ ์์ด)
Source: Dev.to
์๊ฐ
์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ์ ์ด์ ํ๋ ์ฑ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋๋คโWhatsApp ๊ฐ์ ๋ฉ์ ์ ํ๋ซํผ์ด๋ , ๊ณ ๊ฐ ์ง์ ์ฑํ ์ด๋ , ์ปค๋ฎค๋ํฐ ๊ทธ๋ฃน ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ง์ด์ฃ . ์๋ฒ๋ฅผ ์ง์ ๊ตฌ์ถํ๊ณ , WebSocket์ ๊ด๋ฆฌํ๋ฉฐ, ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ๋๊ธฐํํ๋ ๋์ ZEGOCLOUD๋ Flutter ๊ฐ๋ฐ์๋ฅผ ์ํ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ API์ UI ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ZIMKit์ ์ฌ์ฉํ๋ฉด ๋ฐฑ์๋ ์ธํ๋ผ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ ๋ ๋ช ๋ถ ์์ ์ค์๊ฐ ์ฑํ ์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ฒ ํํ ๋ฆฌ์ผ์์๋ ๋ค์์ ํฌํจํ ์ค์๊ฐ ์ฑํ ์ฑ์ ๋ง๋ค๊ฒ ์ต๋๋ค:
- ๋ก๊ทธ์ธ
- 1:1 ์ฑํ
- ๊ทธ๋ฃน ์ฑํ
- ์ค์๊ฐ ๋ฉ์์ง ์ ์ก
- ๋ฐฑ์๋ ๋ถํ์
๋ง๋ค๊ฒ ๋ ๊ฒ
์ด ๊ธ์ ๋๊น์ง ์ฝ์ผ๋ฉด ๋ค์์ ํ ์ ์๊ฒ ๋ฉ๋๋ค:
- Flutter์ ZEGOCLOUD ZIMKit ํตํฉํ๊ธฐ
- ์ฑํ SDK ์ด๊ธฐํํ๊ธฐ
- ๋ก์ปฌ์์ ์ฌ์ฉ์ ๋ฑ๋กํ๊ธฐ
- 1:1 ์ฑํ ๋ง๋ค๊ธฐ
- ๊ทธ๋ฃน ์ฑํ ์์ฑ ๋ฐ ์ฐธ์ฌํ๊ธฐ
- ์ค์๊ฐ์ผ๋ก ๋ํ ๋ชฉ๋ก ํ์ํ๊ธฐ
ZEGOCLOUD๋?
ZEGOCLOUD๋ ๋ค์๊ณผ ๊ฐ์ SDK๋ฅผ ์ ๊ณตํ๋ ํต์ ํ๋ซํผ์ ๋๋ค:
- ์ธ์ฑ ์ฑํ
- ์์ฑ ๋ฐ ์์ ํตํ
- ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ
- ์ธํฐ๋ํฐ๋ธ ๋ฃธ
์น์ฌ์ดํธ:
์ธ์ฑ ์ฑํ
์ ํ:
Flutter ๋ฌธ์:
1๋จ๊ณ โ Zego ZIMKit ์ค์น
pubspec.yaml ํ์ผ์ ์ด๊ณ ZIMKit ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค:

๊ทธ๋ฐ ๋ค์ ์คํํฉ๋๋ค:
flutter pub get
2๋จ๊ณ โ ์ฑํ SDK ์ด๊ธฐํ
์๊ฒฉ ์ฆ๋ช
์ ์ํ ํ์ผ์ ๋ง๋ค๊ณ , ์๋ฅผ ๋ค์ด utils/app_string.dart ๋ฅผ ์์ฑํฉ๋๋ค.
โ ๏ธ AppSign์ ๊ณต๊ฐ ์ ์ฅ์์ ์ ๋ ๋ ธ์ถํ์ง ๋ง์ธ์.
ํ์ Android ์ค์
๊ถํ
android/app/src/main/AndroidManifest.xml ์ ํ์ํ ๊ถํ์ ์ถ๊ฐํฉ๋๋ค:

Proguard ๊ท์น (๋ฆด๋ฆฌ์ค ๋ชจ๋)
android/app/proguard-rules.pro ํ์ผ์ ๋ง๋ค๊ฑฐ๋ ํธ์งํฉ๋๋ค:

Build Gradle ์ค์
android/app/build.gradle ๋ฅผ ํธ์งํ๊ณ minify์ proguard๋ฅผ ํ์ฑํํฉ๋๋ค:


3๋จ๊ณ โ main.dart ์์ ZIMKit ์ด๊ธฐํ
import 'package:chat_app_zegogloud/screens/login.dart';
import 'package:chat_app_zegogloud/utils/app_string.dart';
import 'package:flutter/material.dart';
import 'package:zego_zimkit/zego_zimkit.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
ZIMKit().init(appID: AppString.appID, appSign: AppString.appSign);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Zego Chat',
theme: ThemeData(primarySwatch: Colors.blue),
debugShowCheckedModeBanner: false,
home: const LoginPage(),
);
}
}
4๋จ๊ณ โ ๋ก๊ทธ์ธ ํ์ด์ง ๋ง๋ค๊ธฐ
๋ฐฑ์๋ ์์ด userID์ username์ ์ฌ์ฉํด ๋ก์ปฌ์์ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํฉ๋๋ค.
screens/login.dart
import 'package:chat_app_zegogloud/screens/home.dart';
import 'package:flutter/material.dart';
import 'package:zego_zimkit/zego_zimkit.dart';
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State create() => _LoginPageState();
}
class _LoginPageState extends State {
final userId = TextEditingController();
final userName = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Login to Chat')),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: userId,
decoration: const InputDecoration(labelText: 'User ID'),
),
TextField(
controller: userName,
decoration: const InputDecoration(labelText: 'User Name'),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
ZIMKit().connectUser(id: userId.text, name: userName.text);
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const HomePage()),
);
},
child: const Text('Login'),
),
],
),
),
);
}
}
5๋จ๊ณ โ ๋ํ ๋ชฉ๋ก์ด ์๋ ํ ํ์ด์ง
์ด ํ์ด์ง์์๋ ๋ชจ๋ 1:1 ์ฑํ ๊ณผ ๊ทธ๋ฃน ์ฑํ ์ ๋ณด์ฌ์ค๋๋ค.
screens/home.dart
import 'package:chat_app_zegogloud/screens/login.dart';
import 'package:chat_app_zegogloud/screens/home_page_popUp.dart';
import 'package:flutter/material.dart';
import 'package:zego_zimkit/zego_zimkit.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State create() => _HomePageState();
}
class _HomePageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home Page'),
actions: [
IconButton(icon: const Icon(Icons.logout), onPressed: _handleLogout),
const HomePagePopup(),
],
),
body: ZIMKitConversationListView(
onPressed: (context, conversation) {
// Navigate to chat screen (implementation omitted for brevity)
},
),
);
}
void _handleLogout() {
ZIMKit().logout();
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (_) => const LoginPage()),
);
}
}
๋๋จธ์ง UI(์ฑํ
ํ๋ฉด, ๊ทธ๋ฃน ์์ฑ ๋ฑ)๋ ZIMKitMessageListView, ZIMKitMessageInput ๊ฐ์ ZIMKit ์์ ฏ์ ์ฌ์ฉํ์ฌ ๋์ผํ ํจํด์ผ๋ก ๊ตฌํ๋ฉ๋๋ค. ์ฑ ๋์์ธ์ ๋ง๊ฒ ํ์์ ๋ฐ๋ผ ์กฐ์ ํ์ธ์.