Обратный вызов SurfaceCreated не вызывается, когда я использую компонент NavHostAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Обратный вызов SurfaceCreated не вызывается, когда я использую компонент NavHost

Сообщение Anonymous »

У меня возникла проблема с приложением Jetpack Compose.
Я использую SurfaceView для отображения контента OpenGL или Vulkan.
В этом SurfaceView у меня есть обратный вызов SurfaceCreated, который вызывается на одном из моих реактивных ранцев. создать приложение, но не в моем втором приложении.
SurfaceView выглядит следующим образом:

Код: Выделить всё

public final class VkSurfaceView extends SurfaceView {

public VkSurfaceView(Context pContext, long pViewCPtr) {
super(pContext, pViewCPtr);
setWillNotDraw(false);
SurfaceHolder sh = getHolder();
Log.i(TAG, "getHolder"+ sh.toString());
getHolder().addCallback(this);
}

/**
* This method is part of the SurfaceHolder.Callback interface.
*/
@Override
public void surfaceCreated(final SurfaceHolder pHolder) {
Log.i(TAG, "Surface will be created");
}
Я использую AndroidView для использования этого SurfaceView в моем приложении Jetpack Compose:

Код: Выделить всё

@Composable
fun MapView(
modifier: Modifier = Modifier,
onMapViewAttached: (mapView : VMEMapView) -> Unit = { }
) {
AndroidView(
modifier = modifier.fillMaxSize()
.background(Color.Transparent)
.clipToBounds(), // Occupy the max size in the Compose UI tree

factory = { context ->
VMEMapView(context,null).also {
onMapViewAttached(it)
}
},

update = {

}
)
}

В моем первом рабочем приложении я использую код такого типа:

Код: Выделить всё

@Composable
fun ContentView(
onMapViewCreated: (VMEMapView) -> Unit = {},
loadMapDataRequested: () -> Unit = {},
) {
MapView(
onMapViewAttached = { mapView ->
onMapViewCreated(mapView)
}
)
Box(
modifier = Modifier
) {
}
}
В этом случае все работает.
Но теперь у меня есть другое приложение, которое использует MapView в некоторых компонентах реактивного ранца:

Код: Выделить всё

@Composable
fun MapScreen(onMapViewAttached: (mapView : VMEMapView) -> Unit = { }) {
MapView(
onMapViewAttached = { mapView ->
onMapViewAttached(mapView)
}
)
}

@Composable
private fun ScaffoldContent(
navController: NavHostController,
scope: CoroutineScope,
drawerState: DrawerState,
bottomBar: @Composable () -> Unit
) {
Scaffold(
bottomBar = {
bottomBar()
},
floatingActionButton = {
ExtendedFloatingActionButton(
text = { },
icon = { Icon(Icons.Filled.Add, contentDescription = "") },
onClick = {
scope.launch {
drawerState.apply {
if (isClosed) open() else close()
}
}
}
)
}
)
{ contentPadding ->
// Screen content
Box(modifier = Modifier.padding(contentPadding)) {
NavHost(navController = navController, startDestination = "home") {
composable("home") { HomeScreen() }
composable("map") {
Box(
modifier = Modifier
.background(Color.Yellow)
.padding(32.dp)
) {
MapScreen(
onMapViewAttached = { mapView ->
viewModel.loadMapView(this@MainActivity, mapView)
}
)
}
}
composable("search") { SearchScreen() }
composable("settings") { SettingsScreen() }
}
}
}
}
В этом случае обратный вызов SurfaceCreated никогда не вызывается. Я попытался проверить, правильный ли размер у моего MapView, и вроде все в порядке, поскольку я настроил цветной фон и вижу этот зеленый цвет...

Код: Выделить всё

@Composable
fun MapView(
modifier: Modifier = Modifier,
onMapViewAttached: (mapView : VMEMapView) -> Unit = { }
) {
AndroidView(
modifier = modifier.fillMaxSize()
.background(Color.Green)
.clipToBounds(), // Occupy the max size in the Compose UI tree

factory = { context ->
VMEMapView(context, attributeSet = null).also {
onMapViewAttached(it)

}
},

update = { view ->

}
)
}
Я делаю что-то плохое, что препятствует вызову SurfaceCreated?
Спасибо!
Я пытался установить размер, но у меня все еще есть та же проблема.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -component
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»