import 'package:http/http.dart' as http; import 'dart:convert'; import './announcement_model.dart'; import '../auth_manager.dart'; // 確保引入 AuthManager // API 相關常數 (假設與登入 API 使用相同的 Base URL 結構) const String BASE_IP = "https://api.gex.com.tw:8033"; // **請替換成您實際獲取公告列表的 API 路徑** const String ANNOUNCEMENT_LIST_ENDPOINT = "xapi/v2/eis_demo/orm_api/3/"; const String ANNOUNCEMENT_LIST_URL = "$BASE_IP/$ANNOUNCEMENT_LIST_ENDPOINT"; class AnnouncementApiService { Future> fetchAnnouncements() async { // 1. 讀取儲存的 Token String? token = await AuthManager.getToken(); if (token == null) { print("錯誤:未找到登入 Token,請重新登入!"); // 這裡通常會導航回登入頁面 // return; } // 建立 API 參數 (假設獲取公告列表需要類似的 token/身份驗證參數) final Map params = { "token": '$token', //"page": "${page}", //"perPage": "${perPage}", //"keywords": "${keywords}", "_\$_tableName": "eipbbs_m", "_\$_pk": "uniqueno", "_\$_action": "P", "_\$_query_filter": "1^10^uniqueno^*^^pmsm02^^" }; try { final response = await http.post( Uri.parse(ANNOUNCEMENT_LIST_URL), headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: params, ); // 檢查狀態碼 if (response.statusCode == 200) { // 解析 API 回應 final Map responseData = json.decode(response.body); // 1. 檢查 code 是否為 0 if (responseData['code'] == 0) { // 2. 根據截圖,'data' 是一個 Map,裡面包著 'items' final dynamic dataObject = responseData['data']; // 檢查 dataObject 是否為 Map,且裡面是否有 'items' 並且是 List if (dataObject is Map && dataObject['items'] is List) { // 3. 取得真正的列表 'items' List listJson = dataObject['items']; // 將 JSON 列表轉換為 Announcement 物件列表 return listJson.map((json) => Announcement.fromJson(json)).toList(); } else { // 雖然 code=0,但資料結構不符合預期 (例如 data 是 null 或沒有 items) return []; // 或拋出異常,視您的需求而定 } } else { // API 邏輯失敗 (例如 code 不為 0) throw Exception(responseData['msg'] ?? 'API 呼叫失敗,但連線成功。'); } } else { // HTTP 錯誤 throw Exception('HTTP 錯誤: ${response.statusCode}'); } } catch (e) { // 網路或解析錯誤 print('公告獲取錯誤: $e'); throw Exception('無法載入公告列表,請檢查網路。'); } } }