تكرار السؤال: …
الإجابة المختصرة
بإنشاء فئة ترث ReactContextBaseJavaModule، ووضع وسم @ReactMethod على الدوال المصدرة، وتسجيلها في ReactPackage مخصص لإضافته إلى getPackages() في MainApplication.
الشرح
يتم تحديد اسم الوحدة عبر دالة getName(). الدوال الموسومة بـ @ReactMethod يمكنها استقبال معاملات أساسية (Strings, Numbers, ReadableMap) واستخدام كائن Promise لإرجاع النتائج أو الأخطاء بشكل غير متزامن إلى شفرة الـ JavaScript. هذا الأسلوب (ReactContextBaseJavaModule) خاص بالمعمارية القديمة ويعمل عبر طبقة التوافق؛ أما في المشاريع الجديدة فيُفضَّل Turbo Native Modules مع Codegen.
مثال بالكود
// Kotlin code under android/
class BatteryModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
override fun getName() = "BatteryModule"
@ReactMethod
fun getBatteryLevel(promise: Promise) {
try {
val level = 85 // read from the Android system (BatteryManager)
promise.resolve(level)
} catch (e: Exception) {
promise.reject("ERROR_BATTERY", e.message)
}
}
}أخطاء شائعة
- محاولة إرجاع كائنات مخصصة معقدة مباشرة دون تحويلها إلى WritableMap أو أنواع مدعومة من الـ Bridge.
أسئلة متابعة
- ما هي أداة Codegen في معمارية React Native الجديدة ولماذا تعد إلزامية؟
- كيف تبني Custom Native Module في نظام iOS (Swift / Objective-C)؟