为什么我的SwiftUI列表没有填充我的所有数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的SwiftUI列表没有填充我的所有数据?相关的知识,希望对你有一定的参考价值。

我使用组合方式通过api调用返回数据:

[Animals.Dog(id: nil, name: "Bobby", age: 4), Animals.Dog(id: nil, name: "Cronos", age: 2), Animals.Dog(id: nil, name: "Willy", age: 2), Animals.Dog(id: nil, name: "Rex", age: 8)]
finished

[用动物数组填充我的列表时,仅填充第一项。但是,该相同的第一项所显示的动物数量与它们一样多。在这种情况下,第一个项目被填充4次,而我的列表上看不到其他三只狗。

我的数据隐藏在哪里?

import SwiftUI
import Combine

struct AnimalsView: View 

  @State private var dogs = [Dog]()

  private let networkRequest = NetworkRequest()

  //MARK: - Body
  var body: some View 
    VStack(spacing: 20) 
      TitleView()

      //MARK: Dogs list view
      List(dogs) 
        AnimalCell(name: $0.name,
                   age: $0.age)
      
      .modifierViewList()
    
    .onAppear 
      _ = networkRequest.downloadAnimals()
        .sink(receiveCompletion: 
          print($0)
        ,receiveValue:  (animal) in
          self.dogs = animal.dogs
          print(animal.dogs)
        )
    
  


//MARK: Network request
extension NetworkRequest 
  func downloadAnimals() -> AnyPublisher<Animal, Error> 
    URLSession.shared
      .dataTaskPublisher(for: EndPoint.rates.url)
      .receive(on: networkQueue)
      .map(\.data)
      .decode(type: Animal.self, decoder: JSONDecoder())
      .mapError  (error) -> NetworkRequest.Error in
        switch error 
        case is URLError:
          return Error.addressUnreachable(EndPoint.rates.url)
        default:
          return Error.invalidResponse
        
    
    .eraseToAnyPublisher()
  

答案

如果Animal.Dog符合Identifiable,则所有数据都具有相同的id,即nil。因此,List认为您只有一个不同的Animal.Dog,第一个带有idnil。尝试给他们实际的id

以上是关于为什么我的SwiftUI列表没有填充我的所有数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SwiftUI 列表填充相同的项目 4 次而不是全部 4 个项目?

SwiftUI:动画列表中的圆圈

SwiftUI MacOS 列表的 Inset 填充

为啥我的表没有被填充?

为啥我的 SwiftUI 列表分隔符没有正确排列?

为啥我的 RecyclerView 没有填充来自改造的数据?