Pasar datos a flows en el SDK de Android
Un custom tag es una variable personalizada con un valor proveniente de tu app. Después de seleccionar Value comes from outside the app en la configuración de una variable, tu app puede establecer su valor a través del SDK de Adapty. Por ejemplo, un elemento de texto contiene “Coins:” y un custom tag. Si tu app pasa “120” para el tag, los usuarios ven “Coins: 120”.
Antes de empezar
Necesitas el SDK de Adapty v4 o posterior. Las versiones anteriores a v4 no muestran flows.
Añade etiquetas personalizadas al flow
Para mostrar los valores de tu app en un flow, configura etiquetas personalizadas en el builder:
-
Crea una etiqueta personalizada para cada valor que tu app envíe.
-
Anota el nombre completo de cada etiqueta, incluido su grupo. El código de tu app pasa cada valor con ese nombre. Por ejemplo, si el grupo
usercontiene una etiquetastreak, el nombre completo de la etiqueta esuser.streak.
Pasar valores de etiquetas personalizadas
Crea un AdaptyUiTagResolver y pásalo en el parámetro tagResolver de AdaptyUI.getFlowView. El SDK llama al resolver con el nombre completo de cada etiqueta personalizada, por ejemplo user.streak. El resolver devuelve uno de los siguientes valores:
- Una cadena de texto: los usuarios la ven en lugar de la etiqueta. Debe ser legible, como “1.250”, no “1250.0”. Adapty no la formatea ni traduce.
null: los usuarios ven el valor inicial de la etiqueta como respaldo.- Una cadena vacía: los usuarios no ven nada en lugar de la etiqueta.
Si creas AdaptyFlowView manualmente, pasa el resolver a su método showFlow. En Jetpack Compose, pásalo a AdaptyFlowScreen. Para ver un ejemplo de cada llamada, consulta Mostrar flows y paywalls.
Para probar tus etiquetas personalizadas, abre el flow en tu app después de añadir el código que establece sus valores. El canvas del builder y la vista previa en dispositivos solo muestran los valores iniciales: la app móvil de Adapty no establece los valores de las etiquetas personalizadas.
Si tu app ya establece valores de etiquetas personalizadas para paywalls del antiguo Paywall Builder, revisa en qué se diferencian las etiquetas personalizadas en los flows.
Qué ven los usuarios cuando no hay ningún valor
Los usuarios ven el Valor inicial de una etiqueta personalizada como valor de respaldo en los siguientes casos:
- Tu app no pasa ningún valor para la etiqueta.
- El usuario no ha actualizado tu app a una versión que envíe el valor.
- El nombre en el código de tu app no coincide con el nombre completo de la etiqueta, incluidas las mayúsculas y minúsculas.
- Otra etiqueta personalizada en el mismo elemento de texto no tiene valor. En ese caso, todas las etiquetas personalizadas de ese elemento de texto muestran su valor inicial.
Para no mostrar nada en lugar de una etiqueta, pasa una cadena vacía. Adapty trata una cadena vacía como un valor, por lo que el valor de respaldo no aparece.
Ejemplo: mostrar un IMC a partir de las respuestas del onboarding
Un flow puede recoger respuestas de los usuarios, y una etiqueta personalizada puede mostrar un valor de tu app. Combina ambas cosas para mostrar a los usuarios un resultado que tu app calcula a partir de sus respuestas, como una puntuación, un plan recomendado o una métrica de salud:
- Un flow recoge las respuestas y las envía a tu app.
- Tu app calcula el resultado.
- Tu app pasa el resultado al siguiente flow como valor de etiqueta personalizada.
En este ejemplo, un flow de onboarding recoge el peso y la altura del usuario. Cuando el usuario cierra el flow de onboarding tras su última pantalla, tu app calcula su índice de masa corporal (IMC). Luego abre un flow de paywall que muestra el IMC.
Configura los flows
-
Crea dos flows: un flow de onboarding que recoja el peso y la altura del usuario, y un flow de paywall que muestre su IMC.
-
Añade dos campos de tipo Number al flow de onboarding:
- Uno para el peso en kilogramos, con el Element ID
weight. - Uno para la altura en centímetros, con el Element ID
height.
En ambos campos, establece el Format como Integer. Un campo envía su valor como texto, exactamente tal como lo escribe el usuario, y el código de ejemplo no interpreta “70.5” y “70,5” de la misma manera. Los números enteros no tienen separador decimal, por lo que el código los lee igual en cualquier idioma.
- Uno para el peso en kilogramos, con el Element ID
-
Para asegurarte de que tu app recibe ambos valores, termina el flow de onboarding con una pantalla que no tenga campos. En esa pantalla, añade un botón con la acción Close flow. Los campos envían sus valores cuando pierden el foco o cuando el usuario pasa a otra pantalla. La acción Close flow no los envía. El código de ejemplo solo abre el paywall si el usuario llegó a la última pantalla.
-
En el flow de paywall, crea una etiqueta personalizada llamada
bmi. En el campo Initial value, introduce un guion (—). Los usuarios verán el guion si tu app no pasa ningún IMC. -
Añade un elemento de texto con las palabras “Your BMI:” al flow de paywall. Después de esas palabras, inserta la etiqueta personalizada
bmi. -
Añade el flow de onboarding a un placement, por ejemplo
onboarding. Añade el flow de paywall a un placement con el IDbmi_paywall. El código de Pass the BMI to the paywall obtiene el paywall usando este ID.
Pasa el IMC al paywall
Recoge el peso y la altura de los eventos flow_user_input del flow de onboarding, como se explica en Procesar datos de flows. Para saber cuándo el usuario ha llegado a la última pantalla, espera un evento flow_screen_showed con is_last_screen a true, como se explica en Rastrear vistas de pantallas del flow. Cuando el usuario cierre el flow de onboarding tras esa pantalla, calcula el IMC. Luego crea la vista del flow del paywall y pasa el IMC para el tag personalizado bmi.
Pasa el siguiente listener a la vista del flow de onboarding:
class OnboardingEventListener(
private val onBmiCalculated: (bmi: String) -> Unit,
) : AdaptyFlowDefaultEventListener() {
private val bodyAnswers = mutableMapOf<String, String>()
private var reachedLastScreen = false
override fun onAnalyticEvent(
name: String,
params: Map<String, Any?>,
context: Context,
) {
if (name == "flow_screen_showed" && params["is_last_screen"] == true) {
reachedLastScreen = true
return
}
if (name != "flow_user_input") return
val elementId = params["element_id"] as? String ?: return
val value = params["value"] as? String ?: return
bodyAnswers[elementId] = value
}
override fun onFlowClosed() {
// Reset `bodyAnswers` and `reachedLastScreen` on every close,
// so that the next run starts without old answers.
val answers = bodyAnswers.toMap()
val finished = reachedLastScreen
bodyAnswers.clear()
reachedLastScreen = false
// Number inputs send their values as strings.
if (!finished) return
val weight = answers["weight"]?.toDoubleOrNull() ?: return
val height = answers["height"]?.toDoubleOrNull()?.takeIf { it > 0 } ?: return
val heightInMeters = height / 100
val bmi = weight / (heightInMeters * heightInMeters)
onBmiCalculated(String.format(Locale.getDefault(), "%.1f", bmi))
}
}
When the user closes the onboarding flow after its last screen, the listener calls onBmiCalculated with the BMI. Pass a lambda for onBmiCalculated that calls the following function. The function fetches the paywall flow, creates its view, and passes the BMI for the bmi custom tag:
fun showBmiPaywall(activity: Activity, bmi: String) {
Adapty.getFlow("bmi_paywall") { flowResult ->
when (flowResult) {
is AdaptyResult.Success -> {
AdaptyUI.getFlowConfiguration(flowResult.value) { configResult ->
when (configResult) {
is AdaptyResult.Success -> {
val flowView = AdaptyUI.getFlowView(
activity,
configResult.value,
products = null,
eventListener = AdaptyFlowDefaultEventListener(),
tagResolver = AdaptyUiTagResolver { tag ->
if (tag == "bmi") bmi else null
},
)
// add flowView to your view hierarchy
}
is AdaptyResult.Error -> {
// handle the error
}
}
}
}
is AdaptyResult.Error -> {
// handle the error
}
}
}
}
String.format con Locale.getDefault() utiliza el separador decimal del locale del usuario: “22.7” en inglés, “22,7” en alemán.
Guardar el IMC en el perfil del usuario
Para mostrar a los usuarios distintos flows según su IMC, guárdalo como un atributo personalizado de su perfil. En el Adapty Dashboard, crea un atributo personalizado de tipo Number con la clave bmi. Después, muestra cada flow a una audiencia definida a partir de ese atributo.
Llama al método updateProfile dentro de onFlowClosed, justo después de la línea que calcula bmi. Pasa el valor Double, no la cadena formateada, para que un segmento pueda comparar el IMC con un umbral:
val params = AdaptyProfileParameters.Builder()
.withCustomAttribute("bmi", bmi)
.build()
Adapty.updateProfile(params) { error ->
if (error != null) {
// handle the error
}
}