import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:ln_jq_app/common/model/vehicle_info.dart'; /// 定义登录渠道的枚举类型 enum LoginChannel { station, // 站点 driver, // 司机 none, // 未登录或未知 } class StorageService extends GetxService { late final GetStorage _box; // --- 定义存储时使用的键名 (Key) --- static const String _tokenKey = 'user_token'; static const String _userIdKey = 'user_id'; static const String _channelKey = 'login_channel'; static const String _nameKey = 'user_name'; static const String _phoneKey = 'user_phone'; static const String _idCardKey = 'user_id_card'; static const String _vehicleInfoKey = 'vehicle_info'; static const String _stationAccountKey = 'station_account'; static const String _stationPasswordKey = 'station_password'; // 新增:用于标记“绑定车辆”弹窗是否已在本会话中显示过 static const String _bindDialogShownKey = 'bind_vehicle_dialog_shown'; static StorageService get to => Get.find(); Future init() async { _box = GetStorage(); return this; } // --- Getters --- bool get isLoggedIn => _box.read(_tokenKey)?.isNotEmpty ?? false; String? get token => _box.read(_tokenKey); String? get userId => _box.read(_userIdKey); String? get name => _box.read(_nameKey); String? get phone => _box.read(_phoneKey); String? get idCard => _box.read(_idCardKey); bool get hasVehicleInfo => _box.hasData(_vehicleInfoKey); String? get stationAccount => _box.read(_stationAccountKey); String? get stationPassword => _box.read(_stationPasswordKey); // 新增:获取“绑定车辆”弹窗是否已显示的标志 bool get hasShownBindVehicleDialog => _box.read(_bindDialogShownKey) ?? false; VehicleInfo? get vehicleInfo { final vehicleJson = _box.read(_vehicleInfoKey); if (vehicleJson != null) { return vehicleInfoFromJson(vehicleJson); } return null; } LoginChannel get loginChannel { final channelString = _box.read(_channelKey); if (channelString == 'station') { return LoginChannel.station; } else if (channelString == 'driver') { return LoginChannel.driver; } return LoginChannel.none; } // --- Methods --- Future saveLoginInfo({ required String token, required String userId, required String channel, String? name, String? phone, String? idCard, }) async { await _box.write(_tokenKey, token); await _box.write(_userIdKey, userId); await _box.write(_channelKey, channel); await _box.write(_nameKey, name); await _box.write(_phoneKey, phone); await _box.write(_idCardKey, idCard); } Future saveVehicleInfo(VehicleInfo data) async { await _box.write(_vehicleInfoKey, vehicleInfoToJson(data)); } Future saveStationCredentials(String account, String password) async { await _box.write(_stationAccountKey, account); await _box.write(_stationPasswordKey, password); } // 新增:标记“绑定车辆”弹窗已显示 Future markBindVehicleDialogAsShown() async { await _box.write(_bindDialogShownKey, true); } Future clearVehicleInfo() async { await _box.remove(_vehicleInfoKey); } Future clearStationCredentials() async { await _box.remove(_stationAccountKey); await _box.remove(_stationPasswordKey); } Future clearLoginInfo() async { await _box.remove(_tokenKey); await _box.remove(_userIdKey); await _box.remove(_channelKey); await _box.remove(_nameKey); await _box.remove(_phoneKey); await _box.remove(_idCardKey); await clearVehicleInfo(); // 登出时,清除“绑定车辆”弹窗的显示记录,以便下次登录时可以再次弹出 await _box.remove(_bindDialogShownKey); } }