الفرق بين المراجعتين لصفحة: «ReactNative/backhandler»

من موسوعة حسوب
إضافة الصّفحة
 
طلا ملخص تعديل
 
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: BackHandler في React Native}}</noinclude>
<noinclude>{{DISPLAYTITLE:الواجهة BackHandler في React Native}}</noinclude>
اكتشاف الضغطات على زر الجهاز الخاص بالتنقل للوراء (back navigation)، إذ تسمح لك هذه الواجهة بتسجيل مستمع لحدث لأفعال زر الرجوع للوراء الخاصة بالمنصة، وبذلك يمكن لتطبيق التحكم بكيفية الاستجابة لذلك الزر.


اكتشاف الضغطات على زر الجهاز الخاص بالتنقل للوراء (back navigation).
تُستدعى اشتراكات الحدث (event subscriptions) بترتيب عكسي (أي أنّ الأولويّة لآخر اشتراك مسجل) وإذا أعاد اشتراك واحد القيمةَ ‎‎<code>true</code>‎‎، فلن تُستدعى الاشتراكات المسجلة السابقة. إن لم يعد أي إشتراك القيمة true أو لم يكن أيًا منها مسجلًا، فسيُستدعى الإجراء الافتراضي لزر الرجوع وذلك للخروج من التطبيق.


Android: اكتشاف الضغطات على زر التنقل للوراء، واستدعاء وظيفة زر الرجوع الافتراضية برمجيًا للخروج من التطبيق في حالة عدم وجود مستمعين (listeners) أو في حالة عدم إعادة أي من المستمعين القيمةَ ‎‎<code>true</code>‎‎.
'''تحذير''': إذا أظهر تطبيقك نافذة شرطيّة (‎‎<code>Modal</code>‎‎) مفتوحة، فلن تنشر واجهة <code>BackHandler</code> أي أحداث (انظر توثيق المكون [[ReactNative/modal#onRequestClose|<code>Modal</code>‎‎]]).
 
tvOS: كشف الضغطات على زر القائمة على جهاز التحكم عن بعد الخاص بالتلفاز. (ميّزةٌ لم تُطبَّق بعد: تعطيل وظيفة معالجة زر القائمة برمجيًا لإنهاء التطبيق في حالة عدم إعادة أي من المستمعين القيمةَ ‎‎<code>true</code>‎‎.)
 
iOS: غير معمول به.
 
تُستدعى اشتراكات الحدث (event subscriptions) بترتيب عكسي (أي أنّ الأولويّة لآخر اشتراك مسجل) ، وإذا أعاد اشتراك واحد القيمةَ ‎‎<code>true</code>‎‎، فلن تُستدعى الاشتراكات المسجلة السابقة. تحذير: إذا أظهر تطبيقك نافذة شرطيّة (‎‎<code>Modal</code>‎‎) مفتوحة، فلن تنشر واجهة BackHandler أي أحداث (انظر [https://wiki.hsoub.com/ReactNative/modal توثيق ‎‎<code>Modal</code>‎‎]).


==مثال==
==مثال==
<syntaxhighlight lang="javascript">
إليك مثال عن نمط الاستخدام:<syntaxhighlight lang="javascript">
BackHandler.addEventListener('hardwareBackPress', function() {
BackHandler.addEventListener('hardwareBackPress', function() {
   //  this.onMainScreen و this.goBack
   //  this.onMainScreen و this.goBack
سطر 24: سطر 19:
   return false;
   return false;
});
});
</syntaxhighlight>أما المثال التالي فهو يمثل حالة يؤكد فيها التطبيق على خروج المستخدم منه:
* [https://snack.expo.dev/@hsoubwiki/backhandler-function-component مثال لمكون دالة (Function Component)]
<syntaxhighlight lang="javascript">
import React, { useEffect } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";
const App = () => {
  useEffect(() => {
    const backAction = () => {
      Alert.alert("Hold on!", "Are you sure you want to go back?", [
        {
          text: "Cancel",
          onPress: () => null,
          style: "cancel"
        },
        { text: "YES", onPress: () => BackHandler.exitApp() }
      ]);
      return true;
    };
    const backHandler = BackHandler.addEventListener(
      "hardwareBackPress",
      backAction
    );
    return () => backHandler.remove();
  }, []);
  return (
    <View style={styles.container}>
      <Text style={styles.text}>Click Back button!</Text>
    </View>
  );
};
const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
  }
});
export default App;
</syntaxhighlight>
</syntaxhighlight>


==مثال دورة الحياة==
* [https://snack.expo.dev/@hsoubwiki/backhandler-class-component مثال لمكون صنف (Class Component)]
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
import React, { Component } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";
class App extends Component {
  backAction = () => {
    Alert.alert("Hold on!", "Are you sure you want to go back?", [
      {
        text: "Cancel",
        onPress: () => null,
        style: "cancel"
      },
      { text: "YES", onPress: () => BackHandler.exitApp() }
    ]);
    return true;
  };
   componentDidMount() {
   componentDidMount() {
     this.backHandler = BackHandler.addEventListener('hardwareBackPress', this.handleBackPress);
     this.backHandler = BackHandler.addEventListener(
      "hardwareBackPress",
      this.backAction
    );
   }
   }


   componentWillUnmount() {
   componentWillUnmount() {
     this.backHandler.remove()
     this.backHandler.remove();
  }
 
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.text}>Click Back button!</Text>
      </View>
    );
   }
   }
};


   handleBackPress = () => {
const styles = StyleSheet.create({
     this.goBack(); // يعمل بشكل أفضل عندما يكون هذا التابع غير متزامن
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
  }
});
 
export default App;
</syntaxhighlight>ينشئ BackHandler.addEventListener مستمع حدث ويعيد كائنًا من النوع NativeEventSubscription والذي يجيب أن يُزال باستعمال التابع NativeEventSubscription.remove، أضف إلى ذلك أن التابع BackHandler.removeEventListener يمكن أن يستخدم للغرض نفسه أيضًا، واحرص على أن دالة رد النداء تملك المرجع نفسه الذي استعمل عند استدعاء addEventListener كما موضح في المثال التالي:
 
* [https://snack.expo.dev/@hsoubwiki/backhandler-function-component-2 مثال لمكون دالة (Function Component)]
<syntaxhighlight lang="javascript">
import React, { useEffect } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";
 
const App = () => {
   const backAction = () => {
     Alert.alert("Hold on!", "Are you sure you want to go back?", [
      {
        text: "Cancel",
        onPress: () => null,
        style: "cancel"
      },
      { text: "YES", onPress: () => BackHandler.exitApp() }
    ]);
     return true;
     return true;
  };
  useEffect(() => {
    BackHandler.addEventListener("hardwareBackPress", backAction);
    return () =>
      BackHandler.removeEventListener("hardwareBackPress", backAction);
  }, []);
  return (
    <View style={styles.container}>
      <Text style={styles.text}>Click Back button!</Text>
    </View>
  );
};
const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
   }
   }
});
export default App;
</syntaxhighlight>
</syntaxhighlight>


==بديل دورة الحياة==
* [https://snack.expo.dev/@hsoubwiki/backhandler-class-component-2 مثال لمكون صنف (Class Component)]
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
import React, { Component } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";
class App extends Component {
  backAction = () => {
    Alert.alert("Hold on!", "Are you sure you want to go back?", [
      {
        text: "Cancel",
        onPress: () => null,
        style: "cancel"
      },
      { text: "YES", onPress: () => BackHandler.exitApp() }
    ]);
    return true;
  };
   componentDidMount() {
   componentDidMount() {
     this.backHandler = BackHandler.addEventListener('hardwareBackPress', () => {
     BackHandler.addEventListener("hardwareBackPress", this.backAction);
      this.goBack(); // يعمل بشكل أفضل عندما يكون هذا التابع غير متزامن
      return true;
    });
   }
   }


   componentWillUnmount() {
   componentWillUnmount() {
     this.backHandler.remove();
     BackHandler.removeEventListener("hardwareBackPress", this.backAction);
  }
 
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.text}>Click Back button!</Text>
      </View>
    );
  }
};
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
   }
   }
});
export default App;
</syntaxhighlight>
</syntaxhighlight>
==الاستعمال مع متنقل React==
إن كنت تستعمل متنقل React أي React Navigation للتنقل بين مختلف الشاشات، فيمكنك أن تتبع [https://reactnavigation.org/docs/custom-android-back-button-handling/ دليلهم هذا].
== استعمال خطاف Backhandler ==
لدى خطافات React Native خطافًا جيدًا هو <code>[https://github.com/react-native-community/hooks#usebackhandler useBackHandler]</code> والذي يسهل كثيرًا عملية ضبط مستمعات الأحداث.
==التوابع==
==التوابع==
===‎‎<code>addEventListener()</code>‎‎===
===‎‎<code>addEventListener()</code>‎‎===
سطر 72: سطر 243:
* [https://facebook.github.io/react-native/docs/backhandler صفحة BackHandler في توثيق React Native الرسمي.]
* [https://facebook.github.io/react-native/docs/backhandler صفحة BackHandler في توثيق React Native الرسمي.]
[[تصنيف:ReactNative]]
[[تصنيف:ReactNative]]
[[تصنيف:React Native API]]

المراجعة الحالية بتاريخ 14:14، 9 أكتوبر 2021

اكتشاف الضغطات على زر الجهاز الخاص بالتنقل للوراء (back navigation)، إذ تسمح لك هذه الواجهة بتسجيل مستمع لحدث لأفعال زر الرجوع للوراء الخاصة بالمنصة، وبذلك يمكن لتطبيق التحكم بكيفية الاستجابة لذلك الزر.

تُستدعى اشتراكات الحدث (event subscriptions) بترتيب عكسي (أي أنّ الأولويّة لآخر اشتراك مسجل) وإذا أعاد اشتراك واحد القيمةَ ‎‎true‎‎، فلن تُستدعى الاشتراكات المسجلة السابقة. إن لم يعد أي إشتراك القيمة true أو لم يكن أيًا منها مسجلًا، فسيُستدعى الإجراء الافتراضي لزر الرجوع وذلك للخروج من التطبيق.

تحذير: إذا أظهر تطبيقك نافذة شرطيّة (‎‎Modal‎‎) مفتوحة، فلن تنشر واجهة BackHandler أي أحداث (انظر توثيق المكون Modal‎‎).

مثال

إليك مثال عن نمط الاستخدام:

BackHandler.addEventListener('hardwareBackPress', function() {
  //  this.onMainScreen و this.goBack
  // مثالان فقط، ستحتاج إلى استخدام توابعك الخاصة هنا
  // عادةً ما يُستخدم مكوّن الانتقال هنا للرجوع إلى الحالة السابقة

  if (!this.onMainScreen()) {
    this.goBack();
    return true;
  }
  return false;
});

أما المثال التالي فهو يمثل حالة يؤكد فيها التطبيق على خروج المستخدم منه:

import React, { useEffect } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";

const App = () => {
  useEffect(() => {
    const backAction = () => {
      Alert.alert("Hold on!", "Are you sure you want to go back?", [
        {
          text: "Cancel",
          onPress: () => null,
          style: "cancel"
        },
        { text: "YES", onPress: () => BackHandler.exitApp() }
      ]);
      return true;
    };

    const backHandler = BackHandler.addEventListener(
      "hardwareBackPress",
      backAction
    );

    return () => backHandler.remove();
  }, []);

  return (
    <View style={styles.container}>
      <Text style={styles.text}>Click Back button!</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
  }
});

export default App;
import React, { Component } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";

class App extends Component {
  backAction = () => {
    Alert.alert("Hold on!", "Are you sure you want to go back?", [
      {
        text: "Cancel",
        onPress: () => null,
        style: "cancel"
      },
      { text: "YES", onPress: () => BackHandler.exitApp() }
    ]);
    return true;
  };

  componentDidMount() {
    this.backHandler = BackHandler.addEventListener(
      "hardwareBackPress",
      this.backAction
    );
  }

  componentWillUnmount() {
    this.backHandler.remove();
  }

  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.text}>Click Back button!</Text>
      </View>
    );
  }
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
  }
});

export default App;

ينشئ BackHandler.addEventListener مستمع حدث ويعيد كائنًا من النوع NativeEventSubscription والذي يجيب أن يُزال باستعمال التابع NativeEventSubscription.remove، أضف إلى ذلك أن التابع BackHandler.removeEventListener يمكن أن يستخدم للغرض نفسه أيضًا، واحرص على أن دالة رد النداء تملك المرجع نفسه الذي استعمل عند استدعاء addEventListener كما موضح في المثال التالي:

import React, { useEffect } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";

const App = () => {
  const backAction = () => {
    Alert.alert("Hold on!", "Are you sure you want to go back?", [
      {
        text: "Cancel",
        onPress: () => null,
        style: "cancel"
      },
      { text: "YES", onPress: () => BackHandler.exitApp() }
    ]);
    return true;
  };

  useEffect(() => {
    BackHandler.addEventListener("hardwareBackPress", backAction);

    return () =>
      BackHandler.removeEventListener("hardwareBackPress", backAction);
  }, []);

  return (
    <View style={styles.container}>
      <Text style={styles.text}>Click Back button!</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
  }
});

export default App;
import React, { Component } from "react";
import { Text, View, StyleSheet, BackHandler, Alert } from "react-native";

class App extends Component {
  backAction = () => {
    Alert.alert("Hold on!", "Are you sure you want to go back?", [
      {
        text: "Cancel",
        onPress: () => null,
        style: "cancel"
      },
      { text: "YES", onPress: () => BackHandler.exitApp() }
    ]);
    return true;
  };

  componentDidMount() {
    BackHandler.addEventListener("hardwareBackPress", this.backAction);
  }

  componentWillUnmount() {
    BackHandler.removeEventListener("hardwareBackPress", this.backAction);
  }

  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.text}>Click Back button!</Text>
      </View>
    );
  }
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    fontSize: 18,
    fontWeight: "bold"
  }
});

export default App;

الاستعمال مع متنقل React

إن كنت تستعمل متنقل React أي React Navigation للتنقل بين مختلف الشاشات، فيمكنك أن تتبع دليلهم هذا.

استعمال خطاف Backhandler

لدى خطافات React Native خطافًا جيدًا هو useBackHandler والذي يسهل كثيرًا عملية ضبط مستمعات الأحداث.

التوابع

‎‎addEventListener()‎‎

static addEventListener(eventName, handler)

‎‎exitApp()‎‎

static exitApp()

‎‎removeEventListener()‎‎

static removeEventListener(eventName, handler)

مصادر