Я создаю пользовательский вид нативного представления, который завершает предварительный просмотр камеры с помощью функциональности сканирования QR -кода. Настоящий компонент Android обнаруживает QR -коды, но события не достигают моего кода JavaScript. Вот моя реализация: < /p>
mytestview.kt (View View) < /p>
package com.custman
import android.content.Context
import android.graphics.Color
import android.util.Log
import android.widget.FrameLayout
import android.widget.LinearLayout
import com.facebook.react.bridge.ReactContext
import com.facebook.react.uimanager.ThemedReactContext
class MyTestView(context: Context) : FrameLayout(context) {
val cameraView: CameraNewPreviiw
init {
cameraView = CameraNewPreviiw(context as ThemedReactContext)
cameraView.id = generateViewId()
Log.d("CameraNewPreviiw", cameraView.id.toString())
addView(cameraView, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
}
< /code>
custmanui.kt (View Manager) < /p>
package com.custman
import android.util.Log
import android.widget.FrameLayout
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
import com.facebook.react.common.MapBuilder
class CustManUi(
private val callerContext: ReactApplicationContext
) : SimpleViewManager() {
override fun getName() = REACT_CLASS
override fun createViewInstance(context: ThemedReactContext): MyTestView {
return MyTestView(context).apply {
layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT
)
}
}
override fun getExportedCustomBubblingEventTypeConstants(): Map {
return mapOf(
"topChange" to mapOf(
"phasedRegistrationNames" to mapOf(
"bubbled" to "onChange"
)
)
)
}
override fun getExportedCustomDirectEventTypeConstants(): MutableMap? =
MapBuilder.builder()
.put(ReadCodeEvent.EVENT_NAME, MapBuilder.of("registrationName", "onAverageFpsChanged"))
.build()
companion object {
const val REACT_CLASS = "MyTestView"
}
}
< /code>
cameranewpreviiw.kt (реализация камеры) < /p>
// [Previous imports...]
class CameraNewPreviiw(context: ThemedReactContext) : FrameLayout(context), LifecycleObserver {
// [Other code...]
private fun sendQRCodeEvent(qrCodeData: String) {
val reactContext = context as ReactContext
val surfaceId = UIManagerHelper.getSurfaceId(this)
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, id)
val event = Arguments.createMap().apply {
putString("message", "MyMessage")
}
reactContext
.getJSModule(RCTEventEmitter::class.java)
.receiveEvent(id, "topChange", event)
Log.d("CameraNewPreviiw", "Dispatching ReadCodeEvent with value: $qrCodeData, view id: $id")
dispatcher?.dispatchEvent(ReadCodeEvent(surfaceId, id, qrCodeData))
}
// [Rest of the implementation...]
}
< /code>
readcodeevent.kt (Custom Event) < /p>
package com.custman
import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.events.Event
class ReadCodeEvent(
surfaceId: Int,
viewId: Int,
private val codeStringValue: String?,
) : Event(surfaceId, viewId) {
override fun getEventName(): String = EVENT_NAME
override fun getEventData(): WritableMap =
Arguments.createMap().apply {
putString("codeStringValue", codeStringValue)
}
companion object {
const val EVENT_NAME = "onQRCodeScanned"
}
}
< /code>
app.tsx (реагировать нативный компонент) < /p>
function App(): React.JSX.Element {
return (
{
console.log(value, 'kskskssksksksk');
}}
onAverageFpsChanged={value => {
console.log('kskssk');
}}
onQRCodeScanned={value => {
console.log(value.nativeEvent, 'SSSSS'); // Never gets called
}}
style={{flex: 1, height: '100%'}}
/>
);
}
< /code>
Проблема: < /strong>
QR -коды обнаруживаются в нативном коде (я вижу журналы) < /p>
Метод sendqrcodeevent вызывается с правильными данными < /p>
Но onqrcodesced handler in reaact wonvery fire < /p>
Пробое: < /strong>
Проверенные идентификаторы представления правильно устанавливаются и распространяются < /p>
Пробуют как прямые, так и пузырящиеся события < /p>
подтверждено, что ReactContext правильно проходит через < /p>
Добавленная обширная регистрация, которые показывают события. Обнаружено в нативном коде (я вижу журналы) < /p>
Метод SendQrCodeeVent вызывается с правильными данными < /p>
Но onqrcodescarned handler in react native never fires < /p>
то, что я пробовал: < /strong>
persified persired propress propress propress propage and propaged и propaged и propaged и propaged and propaged и propaged и propaged and propaged and propaged and propaged and popaged и propaged и Propaged и Propaged. Прямые и пузырящие события
подтвердили, что ReactContext правильно проходит через
Добавлено обширное ведение журнала, которое показывает, что события отправляются
Подробнее здесь: https://stackoverflow.com/questions/795 ... javascript
Отрешите нативные события нативных компонентов Android, не достигнув JavaScript ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Отрешите нативные события нативных компонентов Android, не достигнув JavaScript
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Нативные модули: реагируйте нативные носитые модульные подача камеры не видно
Anonymous » » в форуме Android - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-