refactor(flutter): 重构账号模块并新增配对与独立登录页面
- 将 ApiClient 升级为全局单例,支持完整账号生命周期(登录/注册/刷新/校验/退出) - 新增 TokenResponse / VerifyResponse / BindingItem 数据模型 - 新增 SplashPage 启动登录态检查与 LoginPage 独立登录页 - 新增被控端绑定列表展示、配对码兑换及设备选择功能 - 新增全局 401 拦截器,统一处理令牌失效并跳转登录 - 优化令牌存储策略,对齐 Android 端 TokenStore 行为 - 重构主页面 UI,移除内嵌登录对话框,改用独立页面流程
This commit is contained in:
77
webrtc_controller_flutter/lib/models/binding_item.dart
Normal file
77
webrtc_controller_flutter/lib/models/binding_item.dart
Normal file
@@ -0,0 +1,77 @@
|
||||
/// 绑定关系条目,对应服务端 `ClientController#bindingView`。
|
||||
///
|
||||
/// 与 Android 端 `network/model/BindingItem` 字段保持一致。
|
||||
class BindingItem {
|
||||
final String? bindingId;
|
||||
|
||||
/// 被控端设备唯一标识,即连接时的目标设备 ID。
|
||||
final String deviceUid;
|
||||
|
||||
final String? userId;
|
||||
|
||||
/// OWNER / MEMBER。
|
||||
final String? role;
|
||||
|
||||
final String? alias;
|
||||
|
||||
/// ACTIVE / REVOKED。
|
||||
final String? status;
|
||||
|
||||
/// 被控端当前是否在线(信令网络中存在活跃会话)。
|
||||
final bool online;
|
||||
|
||||
const BindingItem({
|
||||
this.bindingId,
|
||||
required this.deviceUid,
|
||||
this.userId,
|
||||
this.role,
|
||||
this.alias,
|
||||
this.status,
|
||||
this.online = false,
|
||||
});
|
||||
|
||||
factory BindingItem.fromJson(Map<String, dynamic> json) => BindingItem(
|
||||
bindingId: json['bindingId'] as String?,
|
||||
deviceUid: (json['deviceUid'] ?? json['deviceId'] ?? '').toString(),
|
||||
userId: json['userId'] as String?,
|
||||
role: json['role'] as String?,
|
||||
alias: json['alias'] as String?,
|
||||
status: json['status'] as String?,
|
||||
online: json['online'] == true,
|
||||
);
|
||||
|
||||
/// 将服务端返回的列表字段解析为绑定条目集合。
|
||||
static List<BindingItem> listFrom(dynamic raw) {
|
||||
if (raw is! List) return const [];
|
||||
return raw
|
||||
.whereType<Map>()
|
||||
.map((e) => BindingItem.fromJson(Map<String, dynamic>.from(e)))
|
||||
.where((e) => e.deviceUid.isNotEmpty)
|
||||
.toList();
|
||||
}
|
||||
|
||||
/// 是否为设备所有者。
|
||||
bool get isOwner => role == 'OWNER';
|
||||
|
||||
/// 列表展示名称:有别名时优先展示别名,否则展示设备 ID。
|
||||
String get name =>
|
||||
(alias != null && alias!.trim().isNotEmpty) ? alias! : deviceUid;
|
||||
|
||||
/// 下拉展示文案:有别名时附带设备 ID。
|
||||
String displayName() {
|
||||
if (alias != null && alias!.trim().isNotEmpty) {
|
||||
return '$alias ($deviceUid)';
|
||||
}
|
||||
return deviceUid;
|
||||
}
|
||||
|
||||
BindingItem copyWith({bool? online}) => BindingItem(
|
||||
bindingId: bindingId,
|
||||
deviceUid: deviceUid,
|
||||
userId: userId,
|
||||
role: role,
|
||||
alias: alias,
|
||||
status: status,
|
||||
online: online ?? this.online,
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user