GOOGLE ADS

sábado, 23 de abril de 2022

Cómo leer la propiedad de @ObservableObject

No sé cómo leer una propiedad que está en una estructura de una clase que es un objeto observable.

Contexto:

Estoy tratando de crear una aplicación que consta de 2 vistas:


  • un calendario personalizado;

  • una ventana emergente con un encabezado 'Daily Joke', fecha con formato 'MM-dd-yyyy' y un texto de broma que se obtiene de Firebase usando id. Cuando el usuario hace clic en una fecha en el calendario, aparece la ventana emergente y muestra el chiste para una fecha seleccionada.


El problema es que la propiedad 'currentDate' (contiene el valor de la fecha seleccionada) a la que hago referencia en el ObservableObject de la clase 'getJoke' no se actualizará cuando el usuario seleccione una fecha diferente. Siempre obtiene el chiste en la fecha de hoy y no en la que el usuario ha seleccionado.

Aquí está el código de:


  • el calendario personalizado (la fecha seleccionada se mantiene en la propiedad 'currentDate')


import SwiftUI
import grpc
struct CustomDatePicker: View {

@State var currentDate: Date
@State var dailyJokePopUp = false
//some code here
// When the user selects the date, currentDate property changes to the selected date
.onTapGesture {
currentDate = value.date
}
// Getting selected day for displaying in dailyJokePopUp
func getCurrentDay()->String{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
let date = dateFormatter.string(from: currentDate)
return date
}



  • la clase que es un @ObservableObject (lo uso para agregar un oyente a Firebase para buscar el texto de broma por su id)


 class getJoke: ObservableObject {

@Published var data = [JokeX]()
@Published var noData = false
@Published var currentDate = Date()

//some code here including adding SnapShotListener

let callCDP = CustomDatePicker(currentDate: currentDate).getCurrentDay()
if id == callCDP {
self.data.append(joke_text_imported)}
}
}
}
}



  • la ventana emergente (llamo al resultado de @ObservableObject para mostrar el texto obtenido de Firebase)


import SwiftUI
struct dailyJokePopUp: View {

@Binding var show: Bool
@ObservedObject var Jokes = getJoke()
var currentDate: Date = Date()

//some code here
ForEach(self.Jokes.data){i in
Text(i.joke_text)
}
//some code here
}

Puedo sospechar que algo anda mal con la forma en que declaro las propiedades. Probé varios contenedores (@Binding, @StateObject), pero me confundí y no funcionó. Espero que alguien pueda ser lo suficientemente amable para ayudarme a resolver el problema.


Solución del problema

Ver modelo

class getJoke: ObservableObject {
@Published var currentDate = Date()
}

Ver que puede cambiar el paso de datos

struct CustomDatePicker: View {
@Binding var currentDate: Date
var body: some View{
VStack {
DatePicker(selection: $currentDate, displayedComponents:.date){
Text("Select your date")
}
.datePickerStyle(.compact)
}
}
}

Y poner todo junto

 struct ContentView: View {

@StateObject var vm = getJoke()

var body: some View {
VStack(spacing: 40) {
CustomDatePicker(currentDate: $vm.currentDate)
Button {
print(vm.currentDate)
} label: {
Text("Show selected date")
}
}
}
}

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...