- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Coil 图像库从 api 加载图像,并使用之前设置的相同 cookie。因此,我想对我的 Ktor 网络调用和使用 Coil 加载图像使用相同的 HttpClient。
如何在 Ktor 和 Coil 之间共享同一个 HttpClient?我想,我需要以某种方式调整依赖关系,但我无法解决这个问题。
我在共享模块中的 KtorApiImpl
class KtorApiImpl(log: Kermit) : KtorApi {
val baseUrl = BuildKonfig.baseUrl
// If this is a constructor property, then it gets captured
// inside HttpClient config and freezes this whole class.
@Suppress("CanBePrimaryConstructorProperty")
private val log = log
override val client = HttpClientProvider().getHttpClient().config {
install(JsonFeature) {
serializer = KotlinxSerializer()
}
install(Logging) {
logger = object : Logger {
override fun log(message: String) {
log.v("Network") { message }
}
}
level = LogLevel.INFO
}
}
init {
ensureNeverFrozen()
}
override fun HttpRequestBuilder.apiUrl(path: String) {
url {
takeFrom(baseUrl)
encodedPath = path
}
}
override fun HttpRequestBuilder.json() {
contentType(ContentType.Application.Json)
}
androidMain 中的实际 HttpClientProvider
var cookieJar: CookieJar = object : CookieJar {
private val cookieStore: HashMap<String, List<Cookie>> = HashMap()
override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
cookieStore[url.host] = cookies
}
override fun loadForRequest(url: HttpUrl): List<Cookie> {
val cookies = cookieStore[url.host]
return cookies ?: ArrayList()
}
}
actual class HttpClientProvider actual constructor() {
actual fun getHttpClient(): HttpClient {
return HttpClient(OkHttp) {
engine {
preconfigured = getOkHttpClient()
}
}
}
}
private fun getOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.cookieJar(cookieJar)
.build()
}
androidApp 中的 ImageLoaderFactory - 如何使用 HttpClient 而不是创建新的?
class CoilImageLoaderFactory(private val context: Context) : ImageLoaderFactory {
override fun newImageLoader(): ImageLoader {
return ImageLoader.Builder(context)
.availableMemoryPercentage(0.25) // Use 25% of the application's available memory.
.crossfade(true) // Show a short crossfade when loading images from network or disk.
.componentRegistry {
add(ByteArrayFetcher())
}
.okHttpClient {
// Create a disk cache with "unlimited" size. Don't do this in production.
// To create the an optimized Coil disk cache, use CoilUtils.createDefaultCache(context).
val cacheDirectory = File(context.filesDir, "image_cache").apply { mkdirs() }
val cache = Cache(cacheDirectory, Long.MAX_VALUE)
// Lazily create the OkHttpClient that is used for network operations.
OkHttpClient.Builder()
.cache(cache)
.build()
}
.build()
}
}
androidApp 中的 Koin 依赖
@Suppress("unused")
class MainApp : Application() {
override fun onCreate() {
super.onCreate()
initKoin(
module {
single<Context> { this@MainApp }
single<AppInfo> { AndroidAppInfo }
single { CoilImageLoaderFactory(get<Context>())}
single<SharedPreferences> {
get<Context>().getSharedPreferences("MAIN_SETTINGS", Context.MODE_PRIVATE)
}
single {
{ Log.i("Startup", "Hello from Android/Kotlin!") }
}
}
)
}
}
然后是主事件
class MainActivity : AppCompatActivity() {
val loaderFactory: CoilImageLoaderFactory by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
CompositionLocalProvider(LocalImageLoader provides loaderFactory.newImageLoader()) {
MainTheme {
ProvideWindowInsets {
Surface {
MainScreen()
}
}
}
}
}
}
}
最佳答案
我使用 ImageLoader 访问了 OkHttpClient
class CoilImageLoaderFactory(private val context: Context) : ImageLoaderFactory, KoinComponent {
val ktorApiImpl: KtorApi by inject()
override fun newImageLoader(): ImageLoader {
return ImageLoader.Builder(context)
.componentRegistry {
add(ByteArrayFetcher())
}
.okHttpClient {
val config = ktorApiImpl.client.engine.config as OkHttpConfig
config.preconfigured as OkHttpClient
}
.build()
}
关于kotlin-multiplatform - 如何在Multiplatform Ktor 和Coil 之间共享HttpClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68592479/
我正在 kotlin 多平台上创建我的第一个应用程序,并且需要获取一些设备的信息,例如语言和国家/地区。 我正在寻找一种使用 Kotlin 多平台在 Android 和 iOS 两种设备上运行的方法。
我正在写一篇关于多平台编程的论文,我想包括关于优点/缺点的部分。据我了解;让任何应用程序成为多平台对于开发人员来说是一个巨大的卖点,因为它使几乎任何计算机用户都成为潜在的买家等等。我只是想找出可能的缺
我想知道多平台应用程序是如何开发的。适用于 MAC/Windows 的 Microsoft Office、适用于 MAC/Windows/Linux 的 FireFox 等应用程序。 如果他们必须为不
我找不到任何关于如何在 Kotlin Multiplatform 中获取 CPointer 的示例,现有的文档也没有多大帮助。在我的 iOS 源集中,我需要构建与以下 Swift 代码等效的 Kotl
我正在寻找一个返回特定于平台的换行字符串的函数。这可以使用 System.lineSeparator() 实现,但它仅在 Kotlin/JVM 中可用。有没有跨平台的功能? 我知道 expect/ac
我正在开发一个 Kotlin 多平台应用程序,我想在我的模型类中使用 @Parcelize 注释。但是在 Kotlin Multiplatform 插件中,@Parcelize 注释在我使用的 kot
我想在我正在编写的 kotlin 多平台库中使用 jetbrains 公开库。我该怎么做呢?我收到一个 gradle 构建错误,它无法找到它需要公开的所有内容。这是我的 gradle 构建 sourc
最近我将我的 KMP 项目拆分为全栈项目和一个核心库(主要由公共(public)数据类组成),发现我需要在现在定义的其中一个数据类上使用 JVM 库中的注释在一个公共(public)模块中。 在 Ko
我尝试为所有类型为 Test 的任务设置以下内容如下: tasks.withType { testLogging { exceptionFormat = TestExcepti
到目前为止,我找不到任何人这样做,所以我会尝试正确说明我面临的问题。 我有一个 compose-ui shared module 中的模块我的 KMP 应用程序。 compose-ui有一个 comm
我正在 Kotlin-Multiplatform 中开始一个项目。通过Java访问资源文件夹很容易,但我不知道如何通过针对Node的JS访问它。 在测试过程中,我发现资源文件存储在一个单独的文件夹中。
我试图使用ShadowJar gradle插件将我的ktor应用打包到胖 jar 中。但是由于shadowJar任务的结果,我每次都会得到几乎空的jar。它仅包含 list (正确设置了主类)。 Gr
以前,使用 Gradle 构建多平台项目依赖于每个目标平台的单独 Gradle 插件:kotlin-platform-common , kotlin-platform-js , 和 kotlin-pl
我正在开发一个多平台项目,iOS 和 JVM(我不直接针对 Android)。根据构建类型(调试或发布),我想配置日志记录级别(即仅打印发布中的错误)。由于没有可用的 BuildConfig 类,我如
现在我正在尝试创建一个连接到 facebook 的多平台应用程序。 我已经通过网络应用程序成功发送邀请并发布到时间线,现在我正计划通过 android 和 iOS 应用程序发布到时间线并在 faceb
我想使用 Coil 图像库从 api 加载图像,并使用之前设置的相同 cookie。因此,我想对我的 Ktor 网络调用和使用 Coil 加载图像使用相同的 HttpClient。 如何在 Ktor
我正在开发一个 KMM 项目,我需要为我的项目创建不同的架构,例如(开发、生产、QA)我可以在 android 部分轻松完成,但我无法在 iOS 中创建相同的架构。我尝试创建我们通常在 iOS 应用程
我创建了一个非常简单的 KMP 项目,其结构如下: -Root --app --gradle --SharedCode --src\commonMain\kotlin\actual.kt
我正在尝试使用新的 Kotlin MultiPlatform 设置发布一个 Android 库(调试/发布)。我能够成功发布 iOS 框架,但不能发布 android 库。这是我最终得到的错误: 配置
我遵循了教程 https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html ,然后我成功创建了androidmain,iosmai
我是一名优秀的程序员,十分优秀!