Flutter SDK
Plugin Flutter yang dibangun di atas SDK iOS / Android native, menyajikan satu CaptchalaClient Dart untuk kedua platform mobile. Mendukung desktop Linux / macOS / Windows melalui WebView terbenam.
Demo di GitHub
📦
Captcha-La/flutter-demo — contoh lengkap dan dapat dijalankan dengan seluruh langkah integrasi.
Instalasi
Add the package from pub.dev:
yaml
# pubspec.yaml
dependencies:
captchala: ^1.3.2
http: ^1.2.0 # used by the demo's token-fetch helpersbash
flutter pub get
flutter run # auto-picks the foreground device
# or:
flutter run -d <device-id>For iOS / macOS the first build runs pod install automatically. Make sure ios/Podfile declares platform :ios, '13.0' (or higher).
Mulai cepat
dart
import 'package:flutter/material.dart';
import 'package:captchala/captchala.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State<LoginScreen> createState() => _LoginScreenState();
}
class _LoginScreenState extends State<LoginScreen> {
String _status = 'Tap to verify';
bool _verifying = false;
Future<void> _runVerify() async {
setState(() { _verifying = true; _status = 'Fetching server_token...'; });
// 1. Fetch a one-shot server_token from YOUR backend.
final initialToken = await fetchServerTokenFromYourBackend();
// 2. Build config from your business action.
final config = CaptchalaConfig(
appKey: 'YOUR_APP_KEY',
action: 'login', // login, register, pay, …
lang: 'en', // en, zh-CN, zh-TW, ja, ko, ms, vi, id
theme: 'light', // 'light' | 'dark'
enableVoice: true,
enableOfflineMode: true,
maskClosable: false,
serverToken: initialToken,
);
// 3. Initialize, register callbacks, then call verify().
final client = await CaptchalaClient.instance.initialize(config);
client.setCallbacks(
onSuccess: (r) async {
// Send r.passToken to YOUR backend for validation.
if (!mounted) return;
setState(() { _status = 'OK: ${r.passToken}'; _verifying = false; });
},
onFail: (e) { if (mounted) setState(() { _status = 'fail: ${e.code}'; _verifying = false; }); },
onError: (e) { if (mounted) setState(() { _status = 'error: ${e.code} ${e.message}'; _verifying = false; }); },
onClose: () { if (mounted && _verifying) setState(() { _status = 'closed'; _verifying = false; }); },
onServerTokenExpired: () => fetchServerTokenFromYourBackend(),
);
await client.verify();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(mainAxisSize: MainAxisSize.min, children: [
ElevatedButton(
onPressed: _verifying ? null : _runVerify,
child: Text(_verifying ? 'Verifying...' : 'Verify with CAPTCHA'),
),
const SizedBox(height: 12),
Text(_status, style: const TextStyle(fontFamily: 'monospace')),
]),
),
);
}
}API utama
| Simbol | Tujuan |
|---|---|
CaptchalaClient.instance | Akses singleton untuk plugin. |
CaptchalaConfig(...) | Record Dart sederhana: appKey, action, lang, theme, enableVoice, enableOfflineMode, maskClosable, serverToken. |
await client.initialize(config) | Menerapkan konfigurasi. Mengembalikan instance klien yang sama agar bisa dirantai dengan setCallbacks. |
setCallbacks(...) | Mendaftarkan callback onSuccess, onFail, onError, onClose, onServerTokenExpired. |
await client.verify() | Membuka tampilan CAPTCHA native (Android: Activity di atas Flutter; iOS: UIViewController). |
CaptchalaResult | Diteruskan ke onSuccess. Field: passToken, challengeId, ttl, isOffline, isClientOnly. |
Validasi sisi server
Teruskan result.passToken (atau result.token) ke backend Anda lalu validasi melalui API CaptchaLa. Jangan pernah mengekspos X-App-Secret di kode klien.
bash
POST https://apiv1.captcha.la/v1/validate
X-App-Key: YOUR_APP_KEY
X-App-Secret: YOUR_APP_SECRET
Content-Type: application/json
{ "pass_token": "<result.passToken>", "client_ip": "<end-user IP>" }Lihat Referensi API untuk endpoint validasi lengkap dan alur X-App-Key / X-App-Secret.
Pemecahan masalah
pod installiOS gagal
Padaios/Podfile, setplatform :ios, '13.0'(atau lebih tinggi). Setelah mengganti versi plugin, jalankanflutter clean && flutter pub get && cd ios && pod install.minSdkVersionAndroid tidak cocok
NaikkanminSdkVersiondiandroid/app/build.gradleke 21. SDK Android native menolak dikompilasi di bawahnya.Callback berjalan di isolate latar belakang
Selalu jagasetStatedenganif (mounted)sebelum mengubah state UI di dalam callback. Demo membungkus setiap callback yang mengubah state dengan pemeriksaan ini.Target desktop (Linux / Windows / macOS)
Linux membutuhkan GTK3 + WebKitGTK + libcurl. Windows perlu Edge WebView2 Runtime (Win 10 1809+). Desktop macOS memakai WebView sistem secara otomatis.
Persyaratan
- Flutter 3.10+ / Dart 3.0+
- Android:
minSdkVersion 21(Android 5.0+) - iOS: 13.0+ with CocoaPods
- Desktop (optional): GTK3 + WebKitGTK on Linux, WebView2 Runtime on Windows 10 1809+