quick_login_helper.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:io';
  4. import 'package:flutter/services.dart';
  5. import 'package:get/get.dart';
  6. import 'package:get/get_core/src/get_main.dart';
  7. import 'package:location/data/consts/build_config.dart';
  8. import 'package:location/data/consts/web_url.dart';
  9. import 'package:location/resource/assets.gen.dart';
  10. import 'package:location/utils/atmob_log.dart';
  11. import 'package:quickpass_yidun_flutter/quickpass_flutter_plugin.dart';
  12. class QuickLoginHelper {
  13. QuickLoginHelper._();
  14. static final String tag = 'QuickLoginHelper';
  15. static final String _businessId = BuildConfig.quickLoginBusinessId;
  16. static final String userAgreement = WebUrl.userAgreement;
  17. static final String privacyPolicy = WebUrl.privacyPolicy;
  18. static final QuickpassFlutterPlugin quickLoginPlugin =
  19. QuickpassFlutterPlugin();
  20. static Map<String, dynamic>? _configMap;
  21. // 新增静态变量存储 preFetchNumber 获取的 ydToken
  22. static String? _storedYdToken;
  23. static Future<void> init() {
  24. return quickLoginPlugin.init(_businessId).then((map) {
  25. bool result = map?['success'];
  26. AtmobLog.d(tag, 'init success:$result');
  27. });
  28. }
  29. static EventChannel getEventChannel() {
  30. return const EventChannel("yd_quicklogin_flutter_event_channel");
  31. }
  32. static void closeLoginAuthView() {
  33. quickLoginPlugin.closeLoginAuthView();
  34. }
  35. static Future<void> _setUiConfig() async {
  36. _configMap ??= await _getFileConfig();
  37. quickLoginPlugin.setUiConfig(_configMap);
  38. }
  39. static Future<Map<String, dynamic>> _getFileConfig() async {
  40. String file = "";
  41. if (Platform.isIOS) {
  42. file = Assets.config.iosQuickLoginConfig;
  43. } else if (Platform.isAndroid) {
  44. file = Assets.config.androidQuickLoginConfig;
  45. }
  46. dynamic configMap = json.decode(await rootBundle.loadString(file));
  47. //自定义配置
  48. if (Platform.isAndroid) {
  49. configMap = getAndroidCustomConfigSetting(configMap);
  50. } else if (Platform.isIOS) {
  51. //TODO ios需参考UI完善自定义配置
  52. }
  53. return {"uiConfig": configMap};
  54. }
  55. static dynamic getAndroidCustomConfigSetting(dynamic configMap) {
  56. final List<dynamic> rawWidgets = configMap['widgets'] ?? [];
  57. final List<Map<String, dynamic>> widgetsMap =
  58. rawWidgets.map((e) => Map<String, dynamic>.from(e)).toList();
  59. //背景图
  60. final Map<String, dynamic> bgHeaderMap = {};
  61. bgHeaderMap['viewId'] = 'bg_header';
  62. bgHeaderMap['type'] = 'ImageView';
  63. bgHeaderMap['isGravityCenter'] = true;
  64. bgHeaderMap['top'] = 0;
  65. bgHeaderMap['backgroundImgPath'] = "bg_header";
  66. bgHeaderMap['width'] = Get.width.toInt();
  67. int height = (Get.width * (648 / 1083)).toInt();
  68. bgHeaderMap['height'] = height;
  69. widgetsMap.add(bgHeaderMap);
  70. //自定义返回按钮
  71. final Map<String, dynamic> backMap = {};
  72. backMap['viewId'] = 'ic_back';
  73. backMap['type'] = 'ImageView';
  74. backMap['isGravityCenter'] = true;
  75. backMap['top'] = 16;
  76. backMap['left'] = 20;
  77. backMap['backgroundImgPath'] = "icon_common_back";
  78. backMap['width'] = 24;
  79. backMap['height'] = 24;
  80. backMap['action'] = 'back';
  81. widgetsMap.add(backMap);
  82. configMap['widgets'] = widgetsMap;
  83. return configMap;
  84. }
  85. // 在初始化方法中添加测试代码(如 initState 或单独的测试按钮
  86. static void preFetchNumber({
  87. required void Function(String token) onSuccess,
  88. required void Function(String? errorMsg) onError,
  89. }) async {
  90. Map<dynamic, dynamic>? map = await quickLoginPlugin.preFetchNumber();
  91. if (map?['success'] == true) {
  92. var ydToken = map?['token'];
  93. // 存储 ydToken 到静态变量
  94. _storedYdToken = ydToken;
  95. AtmobLog.d(tag, 'preFetchNumber success token:$ydToken');
  96. onSuccess(ydToken);
  97. } else {
  98. //获取预设手机号失败
  99. var ydToken = map?['token'];
  100. // 失败时清空存储的 token
  101. _storedYdToken = ydToken;
  102. var errorMsg = map?['errorMsg'];
  103. AtmobLog.e(tag, "preFetchNumber error token:$ydToken,errorMsg:$errorMsg");
  104. onError(errorMsg);
  105. }
  106. }
  107. static void onePassLogin({
  108. required void Function(String ydToken, String accessToken) onSuccess,
  109. required void Function(String? errorMsg) onError,
  110. }) async {
  111. try {
  112. await _setUiConfig();
  113. Map<dynamic, dynamic>? map = await quickLoginPlugin.onePassLogin();
  114. if (map?["success"]) {
  115. var accessToken = map?["accessToken"];
  116. var ydToken = map?["ydToken"] ?? _storedYdToken;
  117. AtmobLog.d(tag,
  118. "onePassLogin success ydToken:$ydToken, accessToken:$accessToken");
  119. onSuccess(ydToken, accessToken);
  120. } else {
  121. var errorMsg = map?["msg"];
  122. AtmobLog.e(tag, "onePassLogin error msg:$errorMsg");
  123. onError(errorMsg);
  124. closeLoginAuthView();
  125. }
  126. } catch (e) {
  127. onError(e.toString());
  128. closeLoginAuthView();
  129. }
  130. }
  131. static void dispose() {
  132. _configMap = null;
  133. }
  134. }