You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JetPack Compose中如何将AndroidView实例传入SearchEngineUiAdapter

解决方案:在Compose中获取AndroidView实例并传入Adapter

要在Compose中获取AndroidView创建的SearchResultsView实例,并将其传入SearchEngineUiAdapter,可以通过保存View实例引用的方式实现,具体步骤如下:

方法一:用状态保存View实例,延迟创建Adapter

  1. 定义可记忆的状态保存SearchResultsView引用,确保Compose重组时不会丢失实例:
val searchResultsView = remember { mutableStateOf<SearchResultsView?>(null) }
  1. 基于View实例创建SearchEngineUiAdapter,通过remember绑定依赖,确保View准备好后才初始化Adapter:
val searchEngineUiAdapter = remember(searchResultsView.value, searchEngine, offlineSearchEngine) {
    searchResultsView.value?.let { view ->
        SearchEngineUiAdapter(
            view = view,
            searchEngine = searchEngine,
            offlineSearchEngine = offlineSearchEngine
        )
    }
}
  1. 在AndroidView的factory中初始化View,并将实例赋值给状态:
AndroidView(
    factory = { context ->
        SearchResultsView(context).apply {
            initialize(
                SearchResultsView.Configuration(
                    CommonSearchViewConfiguration(DistanceUnitType.IMPERIAL)
                )
            )
            searchResultsView.value = this
        }
    },
    modifier = Modifier
        .fillMaxWidth()
        .background(color = Color.Blue)
)

方法二:在View创建时直接初始化Adapter

如果不需要单独持有View实例,可以直接在AndroidView的factory中创建并保存Adapter:

val searchEngineUiAdapter = remember { mutableStateOf<SearchEngineUiAdapter?>(null) }

AndroidView(
    factory = { context ->
        SearchResultsView(context).apply {
            initialize(
                SearchResultsView.Configuration(
                    CommonSearchViewConfiguration(DistanceUnitType.IMPERIAL)
                )
            )
            // 直接在View创建时初始化Adapter并保存
            searchEngineUiAdapter.value = SearchEngineUiAdapter(
                view = this,
                searchEngine = searchEngine,
                offlineSearchEngine = offlineSearchEngine
            )
        }
    },
    modifier = Modifier
        .fillMaxWidth()
        .background(color = Color.Blue)
)

注意事项

  • remember的依赖列表要包含所有影响Adapter初始化的变量(如searchEngine、offlineSearchEngine),确保变量变化时能重新创建Adapter。
  • AndroidView的factory仅在View首次创建时执行,在此处初始化View和Adapter不会重复执行。

内容的提问来源于stack exchange,提问作者Jitendra Prajapati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:11:04