Flutter魔法功能集成插件magic_sdk的使用
Flutter魔法功能集成插件magic_sdk的使用
概述
Magic 允许开发者通过创新的无密码认证流程来保护用户,而不会影响传统 OAuth 实现的用户体验。
移除 loginWithMagicLink()
自 v4.0.0
版本起,所有移动 SDK 中的 Magic 链接(如 loginWithMagicLink()
)已被短信验证码(如 loginWithSMS()
和 loginWithEmailOTP()
)所取代。了解更多 此处。
功能特性
这是您进入安全无密码认证的世界的入口,适用于基于 iOS 或 Android 的 Flutter 应用。
安装
在您的 pubspec.yaml
文件中添加 magic_sdk
依赖:
dependencies:
flutter:
sdk: flutter
magic_sdk: ^4.0.0
运行以下命令以安装依赖:
$ dart pub get
创建SDK实例
在 main.dart
文件中,使用您的发布密钥实例化 Magic:
void main() {
runApp(const MyApp());
Magic.instance = Magic("YOUR_PUBLISHABLE_KEY");
}
使用 Stack
在顶层,并将 Magic.instance.relayer
添加到 Stack
的子元素中,以确保最佳性能。注意:Relayer 是用于在应用和服务之间建立通信的必要组件。确保在需要认证或与区块链交互时始终包含它。
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Magic Demo',
home: Stack(children: [
const LoginPage(),
Magic.instance.relayer
]));
}
}
认证第一个用户
使用以下代码进行用户认证:
var token = await magic.auth.loginWithEmailOTP(email: textController.text);
其他信息
更多详细信息,请参阅 Magic Link Flutter 文档。
示例代码
以下是一个完整的示例代码,展示了如何使用 magic_sdk
进行用户登录。
import 'package:flutter/material.dart';
import 'package:magic_sdk/magic_sdk.dart';
class LoginPage extends StatefulWidget {
const LoginPage({Key? key}) : super(key: key);
[@override](/user/override)
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
Magic magic = Magic.instance;
final myController = TextEditingController(text: 'your.email@example.com');
[@override](/user/override)
void initState() {
super.initState();
/// Checks if the user is already logged in
var future = magic.user.isLoggedIn();
future.then((isLoggedIn) {
if (isLoggedIn) {
/// Navigate to home page
// Navigator.push(context,
// MaterialPageRoute(builder: (context) => const HomePage()));
}
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Magic Demo Login'),
automaticallyImplyLeading: false,
),
body: Center(
child:
Column(mainAxisAlignment: MainAxisAlignment.center, children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 32.0),
child: TextFormField(
controller: myController,
decoration: const InputDecoration(
hintText: 'Enter your email',
),
validator: (String? value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
return null;
},
),
),
TextButton(
style: ButtonStyle(
foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
),
onPressed: () async {
var token =
await magic.auth.loginWithEmailOTP(email: myController.text);
debugPrint('token, $token');
if (token.isNotEmpty) {
/// Navigate to home page
// Navigator.push(context,
// MaterialPageRoute(builder: (context) => const HomePage()));
}
},
child: const Text('Login With Magic Email OTP'),
),
])));
}
}
更多关于Flutter魔法功能集成插件magic_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter魔法功能集成插件magic_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
magic_sdk
是一个用于集成 Magic 身份验证服务的 Flutter 插件。Magic 是一个无密码身份验证解决方案,允许用户通过电子邮件或社交登录进行身份验证,而无需处理密码。通过 magic_sdk
插件,你可以在 Flutter 应用中轻松集成 Magic 的身份验证功能。
以下是如何在 Flutter 项目中使用 magic_sdk
插件的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 magic_sdk
插件的依赖。
dependencies:
flutter:
sdk: flutter
magic_sdk: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 初始化 Magic
在你的 Flutter 项目中,首先需要初始化 Magic。通常,你可以在 main.dart
文件中进行初始化。
import 'package:flutter/material.dart';
import 'package:magic_sdk/magic_sdk.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化 Magic
await Magic.instance.initialize(
apiKey: 'YOUR_MAGIC_API_KEY', // 替换为你的 Magic API Key
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Magic Demo',
home: MagicLoginScreen(),
);
}
}
3. 实现登录功能
接下来,你可以创建一个登录页面,使用 Magic 进行无密码登录。
import 'package:flutter/material.dart';
import 'package:magic_sdk/magic_sdk.dart';
class MagicLoginScreen extends StatefulWidget {
@override
_MagicLoginScreenState createState() => _MagicLoginScreenState();
}
class _MagicLoginScreenState extends State<MagicLoginScreen> {
final _emailController = TextEditingController();
Future<void> _loginWithEmail() async {
try {
final email = _emailController.text.trim();
if (email.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Please enter your email')),
);
return;
}
// 使用 Magic 进行登录
final didToken = await Magic.instance.auth.loginWithMagicLink(email: email);
// 登录成功后,你可以将 didToken 发送到你的后端进行验证
print('DID Token: $didToken');
// 导航到主页
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => HomeScreen()),
);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Login failed: $e')),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Magic Login'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: _emailController,
decoration: InputDecoration(
labelText: 'Email',
),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _loginWithEmail,
child: Text('Login with Magic Link'),
),
],
),
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: Center(
child: Text('Welcome!'),
),
);
}
}
4. 处理用户会话
Magic 会管理用户的会话状态。你可以使用 Magic.instance.user
来获取当前用户的信息,或者检查用户是否已经登录。
Future<void> checkUserSession() async {
final isLoggedIn = await Magic.instance.user.isLoggedIn();
if (isLoggedIn) {
final userMetadata = await Magic.instance.user.getMetadata();
print('User is logged in: $userMetadata');
} else {
print('User is not logged in');
}
}
5. 退出登录
当用户想要退出登录时,你可以调用 logout
方法来结束会话。
Future<void> _logout() async {
await Magic.instance.user.logout();
// 导航回登录页面
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => MagicLoginScreen()),
);
}
6. 处理 Magic 事件
Magic 提供了一些事件监听器,你可以监听这些事件来处理用户登录或登出等操作。
Magic.instance.onEvent.listen((event) {
if (event.type == MagicEventType.Login) {
print('User logged in');
} else if (event.type == MagicEventType.Logout) {
print('User logged out');
}
});