Closed
Description
👟 Reproduction steps
When I try to fetch teams list using Teams
object, I get NPE.
Demo code:
val client = Client().setEndpoint(Application.appWriteEndpoint).setProject(Application.appWriteProjectId).setKey(Application.appWriteApiKey)
val teamsClient = Teams(client)
val teams = teamsClient.list().teams // this line causes NPE, see below
teams.forEach {
println(it.name)
}
👍 Expected behavior
Teams list should load.
👎 Actual Behavior
The call crashes with following stack trace:
Exception in thread "OkHttp Dispatcher" java.lang.NullPointerException: null cannot be cast to non-null type kotlin.collections.Map<kotlin.String, kotlin.Any>
at io.appwrite.models.Team$Companion.from(Team.kt:83)
at io.appwrite.models.TeamList$Companion.from(TeamList.kt:43)
at io.appwrite.services.Teams$list$converter$1.invoke(Teams.kt:43)
at io.appwrite.services.Teams$list$converter$1.invoke(Teams.kt:42)
at io.appwrite.Client$awaitResponse$2$1.onResponse(Client.kt:507)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
I've investigated the crash and found the point. The error occurs in mapping the Team
object's preferences in Team.kt
file:
@Suppress("UNCHECKED_CAST")
fun <T> from(
map: Map<String, Any>,
nestedType: Class<T>
) = Team<T>(
id = map["\$id"] as String,
createdAt = map["\$createdAt"] as String,
updatedAt = map["\$updatedAt"] as String,
name = map["name"] as String,
total = (map["total"] as Number).toLong(),
prefs = Preferences.from(map = map["prefs"] as Map<String, Any>, nestedType),
)
In last line, where prefs
is assigned, actual value of maps["prefs"]
is null
, while cast expects it to be Map<String, Any>
. So the prefs
field in data class Team
should be nullable, and I suggest that the cast should be rewritten, something like that:
prefs = (map["prefs"] as? Map<String, Any>)?.run { prefs = Preferences.from(map = this, nestedType),
🎲 Appwrite version
Version 1.3.x
💻 Operating system
MacOS
🧱 Your Environment
I use io.appwrite:sdk-for-kotlin:2.0.0
which automatically fetches all required dependencies.
👀 Have you spent some time to check if this issue has been raised before?
- I checked and didn't find similar issue
🏢 Have you read the Code of Conduct?
- I have read the Code of Conduct