طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 251 · برمجة الأجهزة الذكية
الدرس 15 · الوحدة 7: مفاهيم التفاعل مع المستشعرات والأجهزة الذكية

دورة حياة الاشتراك بالمستشعر

ابدأ الاشتراك عند الحاجة، وألغِه عند الانتهاء. ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تشرح أهمّية دورة حياة الاشتراك (طاقة وذاكرة).
  • تشترك وتلغي بنمط useEffect + دالّة تنظيف.
  • تستخدم مصفوفة الاعتماديّات بوعي.

١لماذا دورة الحياة مهمّة؟

المستشعر يبثّ باستمرار. إن اشتركتَ ولم تلغِ الاشتراك عند إخفاء الشاشة، يبقى يعمل في الخلفيّة — يستنزف الطاقة ويسرّب الذاكرة. إدارة «متى أبدأ ومتى أتوقّف» هي دورة الحياة.

اللحظةالإجراء الصحيح
ظهور المكوّنابدأ الاشتراك
تحديث الحالةلا تعيد الاشتراك بلا داعٍ
إخفاء/إزالة المكوّنألغِ الاشتراك (تنظيف)

٢النمط الكامل: useEffect بتنظيف

الدالّة التي يعيدها useEffect هي دالّة التنظيف: تُنفَّذ عند إزالة المكوّن. هنا نشترك في الضوء ثم نلغي:

import { useState, useEffect } from 'react';import { View, Text, StyleSheet } from 'react-native';import SmartDevice from 'smartdevice'; export default function App() {  const [lux, setLux] = useState(0);   useEffect(() => {    const unsubscribe = SmartDevice.onLight((v) => setLux(v));  // ابدأ    return () => unsubscribe();                                  // نظّف  }, []);                                                        // مرّة واحدة   return (    <View style={styles.box}>      <Text style={styles.v}>الضوء الحاليّ: {lux} lux</Text>      <Text style={styles.n}>الاشتراك يبدأ عند الظهور ويُلغى عند الإزالة.</Text>    </View>  );} const styles = StyleSheet.create({  box: { padding: 24, alignItems: 'center' },  v: { fontSize: 22, fontWeight: 'bold', color: '#E8820C' },  n: { marginTop: 10, color: '#666', textAlign: 'center' },});

حرّك منزلق الضوء. المصفوفة الفارغة [] تعني: اشترك مرّةً. دالّة الإرجاع تلغي الاشتراك.

٣الخطأ: بلا تنظيف

بلا دالّة تنظيف، يتراكم اشتراكٌ جديد مع كل ظهور، فتُنادى عدّة مرّات (تسرّب):

✗ خطأ
import { useState, useEffect } from 'react';import { View, Text } from 'react-native';import SmartDevice from 'smartdevice'; export default function App() {  const [lux, setLux] = useState(0);  useEffect(() => {    SmartDevice.onLight((v) => setLux(v));   // ✗ بلا إلغاء  }, []);  return <View><Text>{lux}</Text></View>;}
✓ صواب
import { useState, useEffect } from 'react';import { View, Text } from 'react-native';import SmartDevice from 'smartdevice'; export default function App() {  const [lux, setLux] = useState(0);  useEffect(() => {    const stop = SmartDevice.onLight((v) => setLux(v));    return stop;                             // ✓ ألغِ عند الإزالة  }, []);  return <View><Text>{lux}</Text></View>;}

القاعدة: كل اشتراكٍ في useEffect يجب أن يُقابله إلغاءٌ في دالّة التنظيف.

٤مصفوفة الاعتماديّات

المصفوفة الثانية في useEffect تحدّد متى يُعاد التأثير:

[][x]بلا مصفوفة
مرّة عند الظهور فقطعند الظهور وكلّما تغيّر xبعد كل رسم (نادرًا ما نريده)

لاشتراك المستشعر نستخدم [] غالبًا: اشتراكٌ واحد يعيش مع المكوّن.

توقّع وتحقّق

ما الذي يعيده useEffect للتنظيف؟

مصفوفة [] تعني:

إهمال إلغاء الاشتراك يسبّب:

أين نضع الاشتراك؟

الخلاصة

تحدٍّ برمجي: اشتراك نظيف بالضوء

متقدم

اشترك في الضوء بدورة حياةٍ سليمة.

المطلوب:
  • حالة lux تبدأ من 0.
  • في useEffect([]) اشترك بـ SmartDevice.onLight وأعِد دالّة الإلغاء.
  • <Text testID="lux"> يعرض القيمة.
👀 اعرض الناتج المطلوب (وجرّبه)
✓ التحقق الآلي من حلّك:
  • الكود يعمل بلا أخطاء في Console
  • يعرض قيمة الضوء الابتدائيّة 70
  • اشترك بـ onLight
  • أعاد دالّة تنظيف (return)

💡 تلميح 1
خزّن const stop = SmartDevice.onLight(...) ثم return stop.
💡 تلميح 2
الاشتراك يستدعي الدالّة فورًا بالقيمة الحاليّة (70).

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

import { useState, useEffect } from 'react';import { View, Text, StyleSheet } from 'react-native';import SmartDevice from 'smartdevice'; export default function App() {  const [lux, setLux] = useState(0);  useEffect(() => {    const stop = SmartDevice.onLight((v) => setLux(v));    return stop;  }, []);  return (    <View style={{ padding: 20 }}>      <Text testID="lux" style={styles.v}>{lux} lux</Text>    </View>  );} const styles = StyleSheet.create({ v: { fontSize: 24, fontWeight: 'bold', color: '#E8820C' } });
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس