JetPack Compose中如何将AndroidView实例传入SearchEngineUiAdapter
解决方案:在Compose中获取AndroidView实例并传入Adapter
要在Compose中获取AndroidView创建的SearchResultsView实例,并将其传入SearchEngineUiAdapter,可以通过保存View实例引用的方式实现,具体步骤如下:
方法一:用状态保存View实例,延迟创建Adapter
- 定义可记忆的状态保存
SearchResultsView引用,确保Compose重组时不会丢失实例:
val searchResultsView = remember { mutableStateOf<SearchResultsView?>(null) }
- 基于View实例创建
SearchEngineUiAdapter,通过remember绑定依赖,确保View准备好后才初始化Adapter:
val searchEngineUiAdapter = remember(searchResultsView.value, searchEngine, offlineSearchEngine) { searchResultsView.value?.let { view -> SearchEngineUiAdapter( view = view, searchEngine = searchEngine, offlineSearchEngine = offlineSearchEngine ) } }
- 在
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
相关产品推荐
相关产品推荐

