From 7624aff0497e1667be6cfd99167b29e395721803 Mon Sep 17 00:00:00 2001 From: nofyso <1052470899@qq.com> Date: Fri, 6 Feb 2026 00:29:40 +0800 Subject: [PATCH] chore: added type safety to Dio requests and fixed unsafe type casting in lib\modules\phigros --- .../phigros/services/phigros_api_service.dart | 16 +++++--- .../phigros_resource_api_service.dart | 41 +++++++++++-------- .../phigros/services/taptap_service.dart | 7 ++-- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/lib/modules/phigros/services/phigros_api_service.dart b/lib/modules/phigros/services/phigros_api_service.dart index 1f4b676..45220f8 100644 --- a/lib/modules/phigros/services/phigros_api_service.dart +++ b/lib/modules/phigros/services/phigros_api_service.dart @@ -1,11 +1,14 @@ import 'dart:convert'; import 'dart:typed_data'; + import 'package:dio/dio.dart'; /// Phigros API 服务 class PhigrosApiService { static final PhigrosApiService _instance = PhigrosApiService._internal(); + factory PhigrosApiService() => _instance; + static PhigrosApiService get instance => _instance; PhigrosApiService._internal(); @@ -32,13 +35,16 @@ class PhigrosApiService { /// 返回用户信息,包括昵称、头像等 Future getUserInfo(String sessionToken) async { try { - final response = await _dio.get( + final response = await _dio.get>( '/users/me', options: Options(headers: {'X-LC-Session': sessionToken}), ); - + final responseData = response.data; + if (responseData == null) { + throw Exception("获取用户信息失败: 空返回"); + } if (response.statusCode == 200) { - return PhigrosUserInfo.fromJson(response.data); + return PhigrosUserInfo.fromJson(responseData); } else { throw Exception('获取用户信息失败: ${response.statusCode}'); } @@ -58,14 +64,14 @@ class PhigrosApiService { /// 返回游戏存档数据 Future getGameSave(String sessionToken) async { try { - final response = await _dio.get( + final response = await _dio.get>( '/classes/_GameSave', queryParameters: {'limit': 1}, options: Options(headers: {'X-LC-Session': sessionToken}), ); if (response.statusCode == 200) { - final results = response.data['results'] as List?; + final results = response.data?['results'] as List?; if (results != null && results.isNotEmpty) { return PhigrosGameSave.fromJson(results[0]); } diff --git a/lib/modules/phigros/services/phigros_resource_api_service.dart b/lib/modules/phigros/services/phigros_resource_api_service.dart index 36fe6c3..e7fec9f 100644 --- a/lib/modules/phigros/services/phigros_resource_api_service.dart +++ b/lib/modules/phigros/services/phigros_resource_api_service.dart @@ -1,16 +1,18 @@ import 'dart:convert'; import 'package:dio/dio.dart'; -import 'package:rank_hub/models/phigros/song.dart'; -import 'package:rank_hub/models/phigros/collection.dart'; import 'package:rank_hub/models/phigros/avatar.dart'; import 'package:rank_hub/models/phigros/chart.dart'; +import 'package:rank_hub/models/phigros/collection.dart'; +import 'package:rank_hub/models/phigros/song.dart'; /// Phigros 资源 API 服务 class PhigrosResourceApiService { static final PhigrosResourceApiService _instance = PhigrosResourceApiService._internal(); + factory PhigrosResourceApiService() => _instance; + static PhigrosResourceApiService get instance => _instance; PhigrosResourceApiService._internal(); @@ -28,10 +30,11 @@ class PhigrosResourceApiService { Future>> fetchDifficulties() async { try { print('📥 开始获取定数表...'); - final response = await _dio.get('/info/difficulty.tsv'); + final response = await _dio.get('/info/difficulty.tsv'); + final responseData = response.data; - if (response.statusCode == 200 && response.data != null) { - final lines = (response.data as String).split('\n'); + if (response.statusCode == 200 && responseData != null) { + final lines = responseData.split('\n'); final difficulties = >{}; int invalidLineCount = 0; @@ -86,11 +89,12 @@ class PhigrosResourceApiService { print('📥 开始获取乐曲信息...'); // 同时获取乐曲信息和定数表 - final infoResponse = await _dio.get('/info/info.tsv'); + final infoResponse = await _dio.get('/info/info.tsv'); final difficulties = await fetchDifficulties(); + final infoResponseData = infoResponse.data; - if (infoResponse.statusCode == 200 && infoResponse.data != null) { - final lines = (infoResponse.data as String).split('\n'); + if (infoResponse.statusCode == 200 && infoResponseData != null) { + final lines = infoResponseData.split('\n'); final songs = []; int missingDifficultyCount = 0; @@ -170,10 +174,11 @@ class PhigrosResourceApiService { Future> fetchCollections() async { try { print('📥 开始获取收藏品...'); - final response = await _dio.get('/info/collection.tsv'); + final response = await _dio.get('/info/collection.tsv'); + final responseData = response.data; - if (response.statusCode == 200 && response.data != null) { - final lines = (response.data as String).split('\n'); + if (response.statusCode == 200 && responseData != null) { + final lines = responseData.split('\n'); final collections = []; for (final line in lines) { @@ -200,10 +205,11 @@ class PhigrosResourceApiService { Future> fetchAvatars() async { try { print('📥 开始获取头像列表...'); - final response = await _dio.get('/info/avatar.txt'); + final response = await _dio.get('/info/avatar.txt'); + final responseData = response.data; - if (response.statusCode == 200 && response.data != null) { - final lines = (response.data as String).split('\n'); + if (response.statusCode == 200 && responseData != null) { + final lines = responseData.split('\n'); final avatars = []; for (final line in lines) { @@ -233,11 +239,12 @@ class PhigrosResourceApiService { print('📥 开始获取谱面: $songId - $difficulty'); print(' URL: $url'); - final response = await _dio.get(url); + final response = await _dio.get(url); + final responseData = response.data; - if (response.statusCode == 200 && response.data != null) { + if (response.statusCode == 200 && responseData != null) { final chart = PhigrosChart.fromJson( - jsonDecode(response.data) as Map, + jsonDecode(responseData) as Map, ); print('✅ 获取谱面完成: ${chart.totalNotes} 个音符'); return chart; diff --git a/lib/modules/phigros/services/taptap_service.dart b/lib/modules/phigros/services/taptap_service.dart index 4a0f63a..df40cd2 100644 --- a/lib/modules/phigros/services/taptap_service.dart +++ b/lib/modules/phigros/services/taptap_service.dart @@ -1,8 +1,9 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; -import 'package:dio/dio.dart'; + import 'package:crypto/crypto.dart'; +import 'package:dio/dio.dart'; class ShareClient { final Dio _dio; @@ -160,13 +161,13 @@ open.tapapis.cn ) async { final auth = generateMac(token); - final resp = await _dio.get( + final resp = await _dio.get>( 'https://open.tapapis.cn/account/basic-info/v1', queryParameters: {'client_id': clientId}, options: Options(headers: {...tapHeaders, 'Authorization': auth}), ); - return resp.data['data']; + return resp.data!['data']; } Future registerUser(