js_bridge.dart 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import 'dart:convert';
  2. /// JS Bridge 常量定义
  3. class JSBridgeConstants {
  4. // JS 对象名称
  5. static const String nativeAttrs = 'nativeAttrs';
  6. // JS 方法名称
  7. static const String setStatusBarColor = 'setStatusBarColor';
  8. static const String exitWebView = 'exitWebView';
  9. static const String connectVPN = 'connectVPN';
  10. static const String disconnectVPN = 'disconnectVPN';
  11. static const String openApp = 'openApp';
  12. static const String getVPNStatus = 'getVPNStatus';
  13. // Flutter 调用 JS 的方法名称
  14. static const String onVPNStatusChanged = 'onVPNStatusChanged';
  15. static const String onVPNConnected = 'onVPNConnected';
  16. static const String onVPNDisconnected = 'onVPNDisconnected';
  17. static const String onVPNConnecting = 'onVPNConnecting';
  18. }
  19. /// JS Bridge 消息类型
  20. enum JSBridgeMessageType {
  21. setStatusBarColor,
  22. exitWebView,
  23. connectVPN,
  24. disconnectVPN,
  25. openApp,
  26. getVPNStatus,
  27. }
  28. /// JS Bridge 消息
  29. class JSBridgeMessage {
  30. final JSBridgeMessageType type;
  31. final Map<String, dynamic> data;
  32. JSBridgeMessage({required this.type, required this.data});
  33. factory JSBridgeMessage.fromJson(Map<String, dynamic> json) {
  34. final typeStr = json['type'] as String;
  35. final type = JSBridgeMessageType.values.firstWhere(
  36. (e) => e.name == typeStr,
  37. orElse: () => JSBridgeMessageType.getVPNStatus,
  38. );
  39. return JSBridgeMessage(
  40. type: type,
  41. data: json['data'] as Map<String, dynamic>? ?? {},
  42. );
  43. }
  44. Map<String, dynamic> toJson() {
  45. return {'type': type.name, 'data': data};
  46. }
  47. }
  48. /// JS Bridge 响应
  49. class JSBridgeResponse {
  50. final bool success;
  51. final dynamic data;
  52. final String? error;
  53. JSBridgeResponse({required this.success, this.data, this.error});
  54. Map<String, dynamic> toJson() {
  55. return {'success': success, 'data': data, 'error': error};
  56. }
  57. String toJsonString() {
  58. return jsonEncode(toJson());
  59. }
  60. }
  61. /// VPN 连接参数
  62. class VPNConnectParams {
  63. final int? id;
  64. final String? code;
  65. VPNConnectParams({this.id, this.code});
  66. factory VPNConnectParams.fromJson(Map<String, dynamic> json) {
  67. return VPNConnectParams(
  68. id: json['id'] as int?,
  69. code: json['code'] as String?,
  70. );
  71. }
  72. bool get isValid => id != null || code != null;
  73. }
  74. /// 打开 App 参数
  75. class OpenAppParams {
  76. final String packageName;
  77. final String? scheme;
  78. final Map<String, dynamic>? extras;
  79. OpenAppParams({required this.packageName, this.scheme, this.extras});
  80. factory OpenAppParams.fromJson(Map<String, dynamic> json) {
  81. return OpenAppParams(
  82. packageName: json['packageName'] as String,
  83. scheme: json['scheme'] as String?,
  84. extras: json['extras'] as Map<String, dynamic>?,
  85. );
  86. }
  87. }