add DetailView
This commit is contained in:
parent
db894b88e5
commit
e5f155dfce
@ -47,6 +47,12 @@ struct API {
|
||||
return await doRequest(request: request, as: T.self)
|
||||
}
|
||||
|
||||
static func getDramaDetail<T: Codable>(as: T.Type) async -> APIResponse<T> {
|
||||
let request = URLRequest(url: URL(string: url + "detail")!)
|
||||
|
||||
return await doRequest(request: request, as: T.self)
|
||||
}
|
||||
|
||||
// 执行http请求
|
||||
private static func doRequest<T: Codable>(request: URLRequest, as: T.Type) async -> APIResponse<T> {
|
||||
do {
|
||||
|
||||
94
dimensionhub/Views/DetailView.swift
Normal file
94
dimensionhub/Views/DetailView.swift
Normal file
@ -0,0 +1,94 @@
|
||||
//
|
||||
// ListView.swift
|
||||
// dimensionhub
|
||||
//
|
||||
// Created by 安礼成 on 2025/2/21.
|
||||
//
|
||||
import SwiftUI
|
||||
import Observation
|
||||
|
||||
@Observable
|
||||
final class DetailModel {
|
||||
|
||||
struct VoiceActor: Codable {
|
||||
let actor_id: Int
|
||||
let name: String
|
||||
}
|
||||
|
||||
struct Episode: Codable {
|
||||
let id: Int32
|
||||
let name: String
|
||||
let thumb: String
|
||||
let numName: String
|
||||
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case id = "id"
|
||||
case name = "name"
|
||||
case thumb = "thumb"
|
||||
case numName = "num_name"
|
||||
}
|
||||
}
|
||||
|
||||
// 渠道
|
||||
struct Channel: Codable {
|
||||
let name: String
|
||||
let episodes: [Episode]
|
||||
}
|
||||
|
||||
struct DramaDetailResponse: Codable {
|
||||
let name: String
|
||||
let voice_actors: [VoiceActor]
|
||||
let status: Int
|
||||
let channels: [Channel]
|
||||
}
|
||||
|
||||
var name: String = ""
|
||||
var voiceActors: [VoiceActor] = []
|
||||
var status: Int = 0
|
||||
var channels: [Channel] = []
|
||||
|
||||
@MainActor
|
||||
func loadData(dramaId: Int) async {
|
||||
let response = await API.getDramaDetail(as: DramaDetailResponse.self)
|
||||
switch response {
|
||||
case .error(let code, let message):
|
||||
print(code)
|
||||
print(message)
|
||||
case .result(let detail):
|
||||
self.name = detail.name
|
||||
self.voiceActors = detail.voice_actors
|
||||
self.status = detail.status
|
||||
self.channels = detail.channels
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct DetailView: View {
|
||||
@State var detailModel = DetailModel()
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
VStack(alignment: .leading, spacing: 15) {
|
||||
Text(detailModel.name)
|
||||
.font(.system(size: 20))
|
||||
.fontWeight(.bold)
|
||||
HStack(alignment: .center, spacing: 0) {
|
||||
ForEach(detailModel.voiceActors, id: \.actor_id) { actor in
|
||||
Text(actor.name)
|
||||
.font(.system(size: 16))
|
||||
}
|
||||
Text("等")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
.task {
|
||||
await detailModel.loadData(dramaId: 124)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#Preview {
|
||||
DetailView()
|
||||
}
|
||||
@ -25,7 +25,8 @@ struct dimensionhubApp: App {
|
||||
|
||||
var body: some Scene {
|
||||
WindowGroup {
|
||||
IndexView()
|
||||
//IndexView()
|
||||
DetailView()
|
||||
}
|
||||
.modelContainer(sharedModelContainer)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user