O View Client
é muito semelhante ao HttpClient. Enquanto o HttpClient é responsável por lidar com requisições (views, json data, imagens, etc), o ViewClient
é responsável apenas por buscar views (Server Driven Views).
A interface ViewClient tem as funções fetch
e prefetch
.
A implementação padrão de fetch
tem 2 funcionalidades:
response data
em um cache local, e caso exista, esta função o remove do cache e retorna seu conteúdo;HttpClient
e faz uma solicitação para um ResponseData.A implementação padrão do prefech
tem 2 funcionalidades:
HttpClient
e faz a solicitação de um ResponseData e armazena em cache (memória).fetch
apenas procura por respostas que possam ter sido requisitadas anteriormente, e prefetch
apenas armazena respostas. Ele faz isso apenas, geralmente é o bastante para muitas aplicações. Mas pode haver alguma outra situação em que uma aplicação precise de um comportamento extra ao buscar views
, e é nesse momento que um ViewClient
customizado deve ser feito.Um bom exemplo é o cache. Digamos que queremos armazenar uma view
localmente de forma que quando o Beagle chamar viewClient.fetch
novamente, ele retorne o resultado em cache, ao invéz de chamar o HttpClient.
Para fazer isso, criamos uma classe **MyViewClient**
que implementa ViewClient
, que tem uma forma de armazenamento e é anotado com @BeagleComponent
da seguinte forma:
@BeagleComponent
class MyViewClient(
private val httpClient: HttpClient? = BeagleEnvironment.beagleSdk.httpClientFactory?.create(),
private val cachedResponses: MutableMap<String, ResponseData> = mutableMapOf()
) : ViewClient {
override fun fetch(requestData: RequestData, onSuccess: OnSuccess, onError: OnError): RequestCall? {
val cachedResponse = cachedResponses[requestData.url]
return if (cachedResponse != null) {
onSuccess(cachedResponse)
null
} else {
requestData.doRequest(httpClient, onSuccess = { response ->
onSuccess(response)
cachedResponses[requestData.url] = response
}, onError)
}
}
override fun prefetch(requestData: RequestData, onSuccess: OnSuccess, onError: OnError): RequestCall? {
val cachedResponse = cachedResponses[requestData.url]
return if (cachedResponse != null) {
onSuccess(cachedResponse)
null
} else {
requestData.doRequest(httpClient, onSuccess = { response ->
onSuccess(response)
cachedResponses[requestData.url] = response
}, onError)
}
}
companion object {
internal val instance = MyViewClient()
}
}
Neste exemplo implementamos uma lógica para fetch
e prefetch
que irá armazenar cada resultado de busca na memória usando um MutableMap
chamado cachedResponses
. Ele usa a request url como chave, e procura por um ResponseData
toda vez que fetch
ou prefetch
é chamado. Esta é uma implementação simples, pois esse cache nunca expiraria, pois o objetivo aqui é mostrar como esse recurso pode ser implementado usando o ViewClient.
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.