Flutter个性化配置插件persona_flutter的使用

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

Flutter个性化配置插件persona_flutter的使用

描述

persona_flutter 是一个用于Flutter的原生实现,它整合了Persona Inquiry flow。这个插件集成了最新的v2版iOS和Android SDK,以支持身份验证等操作。注意:自2022年12月31日起,Persona停止了对v1版本的支持。如果您需要旧版本的移动集成,请参考此插件的版本2.1.5或v1分支。

安装

要开始使用 persona_flutter,您需要先将其添加为项目的依赖项。打开您的pubspec.yaml文件并添加以下内容:

dependencies:
  persona_flutter: ^最新版本号

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

iOS平台设置

要求

  • 系统要求:iOS 13.0 或更高版本。
  • Info.plist配置
    • 必须添加相机和照片库权限描述:
      <key>NSCameraUsageDescription</key>
      <string>此应用程序需要访问相机。</string>
      <key>NSPhotoLibraryUsageDescription</key>
      <string>此应用程序需要访问相册。</string>
      
    • 如果还需要视频、NFC验证或GPS采集功能,则应额外添加如下权限:
      <key>NSMicrophoneUsageDescription</key>
      <string>此应用程序需要访问麦克风。</string>
      <key>NFCReaderUsageDescription</key>
      <string>此应用程序需要访问NFC。</string>
      <key>NSLocationWhenInUseUsageDescription</key>
      <string>此应用程序需要在使用时访问位置信息。</string>
      

隐私政策

根据苹果的要求,在App Store Connect中提交应用时,必须正确填写关于设备标识符(IDFV)的信息,因为SDK会收集这些数据用于防止欺诈。请确保按照官方提供的指南更新隐私声明。

Android平台设置

要求

  • 修改android/app/build.gradle中的minSdkVersion至21或以上。
  • 声明必要的权限:
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    

隐私政策

当向Google Play商店发布时,需披露有关设备标识符(如App-Set ID)的使用情况,并说明其用途仅限于防欺诈目的。

主题定制

虽然客户端主题定制已被弃用,但在styles.xml中仍然可以进行一些基本的颜色和按钮样式调整。建议通过Persona仪表板上的可视化编辑器来管理主题。

示例代码

下面是一个完整的示例项目结构,展示了如何启动Persona的身份验证流程以及处理各种事件(取消、错误、完成)。请注意,这里展示的是基于模板ID的方式初始化配置,您可以根据实际情况调整。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:persona_flutter/persona_flutter.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late InquiryConfiguration _configuration;

  late StreamSubscription<InquiryCanceled> _streamCanceled;
  late StreamSubscription<InquiryError> _streamError;
  late StreamSubscription<InquiryComplete> _streamComplete;

  @override
  void initState() {
    super.initState();

    // 初始化配置
    _configuration = TemplateIdConfiguration(
      templateId: "itmpl_Q6ymLRwKfY8PGEjqsCjhUUfu",
      environment: InquiryEnvironment.sandbox,
      theme: InquiryTheme(
        source: InquiryThemeSource.client,
        accentColor: Color(0xff22CB8E),
        primaryColor: Color(0xff22CB8E),
        buttonBackgroundColor: Color(0xff22CB8E),
        darkPrimaryColor: Color(0xff167755),
        buttonCornerRadius: 8,
        textFieldCornerRadius: 0,
      ),
    );

    // 监听取消事件
    _streamCanceled = PersonaInquiry.onCanceled.listen(_onCanceled);
    // 监听错误事件
    _streamError = PersonaInquiry.onError.listen(_onError);
    // 监听完成事件
    _streamComplete = PersonaInquiry.onComplete.listen(_onComplete);
  }

  @override
  void dispose() {
    _streamCanceled.cancel();
    _streamError.cancel();
    _streamComplete.cancel();
    super.dispose();
  }

  void _onCanceled(InquiryCanceled event) {
    print("Inquiry was canceled.");
    print("- inquiryId: ${event.inquiryId}");
    print("- sessionToken: ${event.sessionToken}");
  }

  void _onError(InquiryError event) {
    print("An error occurred during the inquiry.");
    print("- error: ${event.error}");
  }

  void _onComplete(InquiryComplete event) {
    print("Inquiry completed successfully.");
    print("- inquiryId: ${event.inquiryId}");
    print("- status: ${event.status}");

    print("- collected fields:");
    for (var key in event.fields.keys) {
      print("-- key: $key, value: ${event.fields[key]}");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Persona Inquiry Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                await PersonaInquiry.init(configuration: _configuration);
                await PersonaInquiry.start();
              } catch (e) {
                print("Failed to start inquiry: $e");
              }
            },
            child: Text("Start Inquiry"),
          ),
        ),
      ),
    );
  }
}

以上就是关于persona_flutter插件的基本介绍和使用方法,希望可以帮助到您!如果有任何问题或者需要进一步的帮助,请随时提问。


更多关于Flutter个性化配置插件persona_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter个性化配置插件persona_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 persona_flutter 插件来进行 Flutter 个性化配置的示例代码。persona_flutter 插件通常用于根据用户的偏好进行个性化设置,比如主题、语言等。以下是一个基本的实现示例:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 persona_flutter 依赖:

dependencies:
  flutter:
    sdk: flutter
  persona_flutter: ^latest_version  # 替换为最新版本号

2. 导入插件

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

import 'package:persona_flutter/persona_flutter.dart';

3. 初始化插件

在你的应用入口(通常是 main.dart)中初始化 PersonaFlutter 插件,并设置默认的个性化配置:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化 PersonaFlutter 插件
    PersonaFlutter.initialize();

    // 获取当前个性化配置(如果有)
    PersonaFlutter.getUserPreferences().then((preferences) {
      // 你可以在这里根据 preferences 做一些 UI 调整
      print('User Preferences: $preferences');
    });

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

4. 设置个性化配置

你可以在应用的某个地方(比如设置页)让用户更改个性化配置,并保存这些配置:

class SettingsPage extends StatefulWidget {
  @override
  _SettingsPageState createState() => _SettingsPageState();
}

class _SettingsPageState extends State<SettingsPage> {
  String themeMode = 'light';  // 默认主题模式

  void changeThemeMode(String newMode) {
    setState(() {
      themeMode = newMode;
      
      // 保存用户偏好设置
      PersonaFlutter.setUserPreferences({
        'theme_mode': newMode,
      });

      // 根据新设置应用主题(这里只是一个示例,实际应用可能需要更复杂的逻辑)
      if (newMode == 'dark') {
        // 切换到暗色主题
      } else {
        // 切换到亮色主题
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            SwitchListTile(
              title: Text('Dark Mode'),
              value: themeMode == 'dark',
              onChanged: (newValue) {
                changeThemeMode(newValue ? 'dark' : 'light');
              },
            ),
          ],
        ),
      ),
    );
  }
}

5. 应用个性化配置

在应用的根组件或者需要根据个性化配置动态调整的组件中,根据保存的用户偏好来应用设置:

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ThemeMode _currentThemeMode = ThemeMode.light;

  @override
  void initState() {
    super.initState();
    
    // 从 PersonaFlutter 获取个性化配置
    PersonaFlutter.getUserPreferences().then((preferences) {
      String themeMode = preferences['theme_mode'] ?? 'light';
      
      setState(() {
        _currentThemeMode = themeMode == 'dark' ? ThemeMode.dark : ThemeMode.light;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo Home Page',
      themeMode: _currentThemeMode,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        primarySwatch: Colors.grey,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Home Page'),
        ),
        body: Center(
          child: Text('Hello, Flutter!'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => SettingsPage()),
            );
          },
          tooltip: 'Go to settings',
          child: Icon(Icons.settings),
        ),
      ),
    );
  }
}

以上代码示例展示了如何在 Flutter 应用中使用 persona_flutter 插件来初始化、获取和设置用户个性化配置。根据你的实际需求,你可以进一步扩展和自定义这些功能。

回到顶部