Skip to content

Latest commit

 

History

History
121 lines (88 loc) · 5.55 KB

fetcher_zh.md

File metadata and controls

121 lines (88 loc) · 5.55 KB

Fetcher

翻译:English

Fetcher 用于从 uri 获取数据,返回 FetchResult,交由 Decoder 使用。

Sketch 支持的每一种 uri 都有对应的 Fetcher 实现,如下表所示:

URI Fetcher Create Dependent modules Android iOS Desktop Web
http://, https:// HttpUriFetcher - -
file://, / FileUriFetcher newFileUri() -
file:///compose_resource/ ComposeResourceUriFetcher newComposeResourceUri() sketch-compose-resources
data:image/jpeg;base64 Base64UriFetcher newBase64Uri() -
file:///android_asset/ AssetUriFetcher newAssetUri() -
content:// ContentUriFetcher - -
android.resource:// ResourceUriFetcher newResourceUri() -
app.icon:// AppIconUriFetcher newAppIconUri() sketch-extensions-core
file:///kotlin_resource/ KotlinResourceUriFetcher newKotlinResourceUri() -

注册 Fetcher

需要依赖单独模块的 Fetcher(例如 ComposeResourceUriFetcher),需要在初始化 Sketch 时注册,如下:

// 在自定义 Sketch 时为所有 ImageRequest 注册
Sketch.Builder(context).apply {
    components {
        addFetcher(ComposeResourceUriFetcher.Factory())
    }
}.build()

// 加载图片时为单个 ImageRequest 注册
ImageRequest(context, "https://www.example.com/image.gif") {
    components {
        addFetcher(ComposeResourceUriFetcher.Factory())
    }
}

扩展 Fetcher

先实现 Fetcher 接口定义你的 Fetcher 和它的 Factory,然后通过 addFetcher() 方法注册即可,如下:

class MyFetcher : Fetcher {

    override suspend fun fetch(): Result<FetchResult> {
        // 在这里解析你的 uri,获取数据
    }

    companion object {
        const val MY_SCHEME = "myUri"
    }

    class Factory : Fetcher.Factory {

        override fun create(sketch: Sketch, request: ImageRequest): MyFetcher? {
            return if (request.uri.startWith("$MY_SCHEME://")) {
                MyFetcher()
            } else {
                null
            }
        }
    }
}

// 在自定义 Sketch 时为所有 ImageRequest 注册
Sketch.Builder(context).apply {
    components {
        addFetcher(MyFetcher.Factory())
    }
}.build()

// 加载图片时为单个 ImageRequest 注册
ImageRequest(context, "myUri://sample.jpeg") {
    components {
        addFetcher(MyFetcher.Factory())
    }
}