尝试使用Apollo Kotlin的compose支持(第一部分)

 

从apollo-kotlin 3.8.0开始,添加了Jetpack Compose对Apollo查询的扩展支持,使其更易于使用。

我打算试试看使用的感觉。

进行安装

我会找一个合适的GraphQL API的示例。我会去看一下Apollo的博客文章,其中介绍了一个可以用于演示的GraphQL API。

 

有一个公开的API供应图鉴和动画清单的使用,真有意思。让我们尝试使用经常被使用的星球大战的API。

 

我将下载模式。

 ./gradlew :app:downloadApolloSchema --endpoint='https://swapi-graphql.netlify.app/.netlify/functions/index' --schema=app/src/main/graphql/schema.graphqls

DL完成后,我会简单地添加一些查询作为测试用途。

query Test {
    allFilms {
        films {
            title
        }
    }
}

考试代码

我会简单地写一个投入测试查询并显示结果的程序。

val apolloClient = ApolloClient.Builder()
    .serverUrl("https://swapi-graphql.netlify.app/.netlify/functions/index")
    .build()
@OptIn(ApolloExperimental::class)
@Composable
private fun FilmList(apolloClient: ApolloClient) {
    val response by apolloClient.query(TestQuery()).toState()
    val data = response?.data
    val exception = response?.exception

    when {
        response == null -> CircularProgressIndicator()
        exception != null || response?.hasErrors() == true -> {
            Text(text = "Error!")
        }
        data != null -> {
            FilmList(films = data.allFilms?.films ?: emptyList())
        }
    }
}

@Composable
private fun FilmList(
    films: List<TestQuery.Film?>,
    modifier: Modifier = Modifier,
) {
    LazyColumn(modifier = modifier) {
        items(items = films) { film ->
            Text(text = film?.title ?: "")
        }
    }
}

一旦这样就可以得到电影的标题列表。

example

由于读取状态也可以为空,因此还会显示加载指示器。

当您编写了一个混乱的查询并出现错误时,您也可以处理错误情况。

apollo-compose-error.png
query Test {
    allFilms {
        films {
            title
        }
    }

    node(id: "aaaaaaa") { # Error!
        ... on Film {
            title
        }
    }
}

在使用上,因为库能够将其作为状态进行处理,所以通过组合的方式直接查询并传递是非常方便的。

虽然如此,考试如何进行,如何适应屏幕旋转等常见话题似乎很多。
我打算另外调查一下这些方面。

接下来,我希望能够考虑到分页的机制,因此我想看看能够如何去实现这一部分。

广告
将在 10 秒后关闭
bannerAds