Flutter身份验证插件smart_auth的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter身份验证插件smart_auth的使用

简介

smart_auth 是一个用于Flutter应用的身份验证插件,主要用于Android平台上的SMS代码监听、手机号码提示等功能。它可以帮助开发者实现自动化的短信验证码读取和用户手机号码获取,提升用户体验。

特性

支持与文档

配置要求

1. 设置Kotlin版本为1.8.0或以上,Gradle插件版本为8.3.2

如果你使用的是旧版的imperative apply方式:

// android/build.gradle
buildscript {
    ext.kotlin_version = '1.8.0'
    dependencies {
        classpath 'com.android.tools.build:gradle:8.3.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

如果你使用的是新版的declarative plugin方式:

// android/settings.gradle
plugins {
    id "org.jetbrains.kotlin.android" version "1.8.0" apply false
    id "com.android.application" version "8.3.2" apply false
}

2. 设置Gradle版本为8.4.0或以上

// android/gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip

3. 设置Java版本为11

// android/app/build.gradle
compileOptions {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}

kotlinOptions {
    jvmTarget = '11'
}

使用方法

创建SmartAuth实例

final smartAuth = SmartAuth.instance;

请求电话号码提示

void requestPhoneNumberHint() async {
  final res = await smartAuth.requestPhoneNumberHint();
  if (res.hasData) {
    // 使用电话号码
  } else {
    // 处理错误
  }
}

获取带有用户同意的SMS

void getSmsWithUserConsentApi() async {
  final res = await smartAuth.getSmsWithUserConsentApi();
  if (res.hasData) {
    final code = res.requireData.code;

    /// 验证码可能为空,如果短信已接收但未提取出验证码
    if (code == null) return;
    // 使用验证码
  } else if (res.isCanceled) {
    // 用户取消了对话框
  } else {
    // 处理错误
  }
}

使用SMS Retriever API获取SMS

void getSmsWithRetrieverApi() async {
  final res = await smartAuth.getSmsWithRetrieverApi();
  if (res.hasData) {
    final code = res.requireData.code;

    /// 验证码可能为空,如果短信已接收但未提取出验证码
    if (code == null) return;
    // 使用验证码
  } else {
    // 处理错误
  }
}

移除监听器

void removeSmsListener() {
  smartAuth.removeUserConsentApiListener();
  // 或者
  smartAuth.removeSmsRetrieverApiListener();
}

示例Demo

以下是一个完整的示例代码,展示了如何在Flutter应用中使用smart_auth插件:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:smart_auth/smart_auth.dart';

void main() {
  runApp(const MyApp());
}

/// 这个示例演示了如何使用SmartAuth插件。
class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final smartAuth = SmartAuth.instance;
  final pinputController = TextEditingController();
  String? appSignature;

  @override
  void dispose() {
    /// 如果SMS验证码尚未接收到,则移除监听器
    smartAuth.removeSmsRetrieverApiListener();
    smartAuth.removeUserConsentApiListener();
    pinputController.dispose();
    super.dispose();
  }

  Future<void> getAppSignature() async {
    final res = await smartAuth.getAppSignature();
    setState(() => appSignature = res.data);
    debugPrint('Signature: $res');
  }

  Future<void> userConsent() async {
    final res = await smartAuth.getSmsWithUserConsentApi();
    if (res.hasData) {
      debugPrint('userConsent: $res');
      final code = res.requireData.code;

      /// 验证码可能为空,如果短信已接收但未提取出验证码
      if (code == null) return;
      pinputController.text = code;
      pinputController.selection = TextSelection.fromPosition(
        TextPosition(offset: pinputController.text.length),
      );
    } else if (res.isCanceled) {
      debugPrint('userConsent canceled');
    } else {
      debugPrint('userConsent failed: $res');
    }
  }

  Future<void> smsRetriever() async {
    final res = await smartAuth.getSmsWithRetrieverApi();
    if (res.hasData) {
      debugPrint('smsRetriever: $res');
      final code = res.requireData.code;

      /// 验证码可能为空,如果短信已接收但未提取出验证码
      if (code == null) return;
      pinputController.text = code;
      pinputController.selection = TextSelection.fromPosition(
        TextPosition(offset: pinputController.text.length),
      );
    } else {
      debugPrint('smsRetriever failed: $res');
    }
  }

  Future<void> requestPhoneNumberHint() async {
    final res = await smartAuth.requestPhoneNumberHint();
    if (res.hasData) {
      // 使用电话号码
    } else {
      // 处理错误
    }
    debugPrint('requestHint: $res');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: const Locale('es', ''),
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: const [
        Locale('en', ''),
        Locale('es', ''),
      ],
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              mainAxisAlignment: MainAxisAlignment.center,
              mainAxisSize: MainAxisSize.min,
              children: [
                Padding(
                  padding: const EdgeInsets.all(8),
                  child: TextField(
                    controller: pinputController,
                    decoration: const InputDecoration(
                      hintText: 'Code',
                      border: OutlineInputBorder(),
                    ),
                  ),
                ),
                TextButton(
                  onPressed: userConsent,
                  child: const Text('Sms User Consent API'),
                ),
                TextButton(
                  onPressed: smsRetriever,
                  child: const Text('Sms Retriever API'),
                ),
                TextButton(
                  onPressed: getAppSignature,
                  child: const Text('Get App Signature'),
                ),
                if (appSignature != null)
                  SelectableText(
                    'App Signature: $appSignature',
                    textAlign: TextAlign.center,
                  ),
                TextButton(
                  onPressed: requestPhoneNumberHint,
                  child: const Text('Request Phone Number Hint'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

通过上述代码,你可以快速集成并测试smart_auth插件的功能。希望这些信息对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter身份验证插件smart_auth的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter身份验证插件smart_auth的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用smart_auth插件进行身份验证的示例代码。smart_auth是一个假设的插件名称,因为在实际Flutter生态系统中并没有一个广泛使用的名为smart_auth的官方插件。不过,我们可以根据常见的身份验证插件(如Firebase Authentication、OAuth等)的概念来编写一个示例。

假设smart_auth插件提供了基本的登录和注册功能,我们可以这样使用它:

1. 添加依赖

首先,在你的pubspec.yaml文件中添加smart_auth依赖(注意:这是一个假设的插件,你需要替换为实际存在的插件):

dependencies:
  flutter:
    sdk: flutter
  smart_auth: ^1.0.0  # 假设的版本号

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入smart_auth插件:

import 'package:smart_auth/smart_auth.dart';

3. 初始化插件

在你的应用启动时(例如在MainActivity.ktAppDelegate.swift中,具体取决于你的平台),你可能需要初始化一些必要的配置。但在这个Flutter示例中,我们主要关注Dart代码。

4. 使用插件进行身份验证

以下是一个简单的示例,展示了如何使用smart_auth插件进行用户注册和登录:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Auth Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AuthScreen(),
    );
  }
}

class AuthScreen extends StatefulWidget {
  @override
  _AuthScreenState createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  final SmartAuth _auth = SmartAuth();
  String _message = '';

  Future<void> _registerUser() async {
    try {
      String email = 'user@example.com';
      String password = 'password123';
      await _auth.registerWithEmailAndPassword(email: email, password: password);
      setState(() {
        _message = 'User registered successfully!';
      });
    } catch (e) {
      setState(() {
        _message = 'Failed to register user: ${e.message}';
      });
    }
  }

  Future<void> _loginUser() async {
    try {
      String email = 'user@example.com';
      String password = 'password123';
      await _auth.signInWithEmailAndPassword(email: email, password: password);
      setState(() {
        _message = 'User logged in successfully!';
      });
    } catch (e) {
      setState(() {
        _message = 'Failed to log in user: ${e.message}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Auth Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_message),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _registerUser,
              child: Text('Register'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _loginUser,
              child: Text('Login'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 插件方法:上述代码中的_auth.registerWithEmailAndPassword_auth.signInWithEmailAndPassword是假设的方法。你需要根据smart_auth插件的实际API文档来调整这些方法调用。

  2. 错误处理:在实际应用中,你应该更细致地处理错误,例如显示不同的错误消息给用户,或者根据错误类型执行不同的操作。

  3. UI/UX:上述示例的UI非常简单,你可能需要根据你的应用需求进行定制。

  4. 安全性:确保在生产环境中使用安全的身份验证方法,并遵循最佳实践来保护用户数据。

由于smart_auth是一个假设的插件,你可能需要查找一个实际存在的身份验证插件(如Firebase Authentication)并按照其文档进行集成。希望这个示例能帮助你理解如何在Flutter项目中使用身份验证插件。

回到顶部