Отрешите нативные события нативных компонентов Android, не достигнув JavaScriptAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Отрешите нативные события нативных компонентов Android, не достигнув JavaScript

Сообщение Anonymous »

Я создаю пользовательский вид нативного представления, который завершает предварительный просмотр камеры с помощью функциональности сканирования 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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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