حفظ بيانات الtoken و onBoarding في cacheHelper
في هذا المقال سوف نتعرف على تطبيق على استخدام SharedPreferences وتخزين مجموعة من القيم بداخله , وفي هذا المقال سوف نقوم بتهئية الملف لتخزين قيم مختلفه وحذف القيم والحصول عليها وايضا سوف تتمكن من اتقان التعامل معه بكل سهوله وسوف تصبح قادر على التعامل مع البيانات وتخزينها لدى الذاكره المؤقته في تطبيقك بكل سهوله دون الحاجه الى تعقيد العملية وكل هذا سيتم توضيحه في المقاله .
اصبحت تقنية تطوير تطبيقات الجوال والهواتف الذكيه من اهم ال technology المستخدمه في الفتره الحاليه والتي عليها طلب كبير جدا من الاشخاص الذين يريدون تعلمها لاصدار التطبيقات الخاصه بهم وتطويرها بنفسهم دون الحاجه الى الى الاستعانه بمطور android او mobile application developer وهو الشخص المتخصص في تطوير التطبيقات ، وايضا هذة المهاره اصبحت مصدر دخل لكثير من الاشخاص .
تعتمد عمليات تطوير تطبيقات android على لغتي java و kotlin وهذا للتطبيقات ال native وهي التطوير التي تعمل على منصة واحده ويكون ال performance الخاص بها افضل من غيره على عكس التقنيات الحديثة والتي تسمى Cross platform مثل react native و flutter والتي تجعلك بكود واحد تشغيل التطبيقات على أكثر من منصة بنفس الكود ، ويوجد في موقعنا شروحات flutter ايضا .
تهيئة ملف SharedPreferences
سوف نقوم بكتابة الاكواد التالية داخل ملف الSharedPreferences وهي بكل بساطة اننا نقوم بتخزين اي نوع من البيانات وايضا نقوم بإستدعاء اي نوع من البيانات وعند الحذف نقوم فقط بكتابة الkey وسوف يعمل على حذفه من الذاكرة المؤقته ولن يصبح موجود في جهازك .
chache.dart
class CashHelper {
static late SharedPreferences sharedPreferences;
static init() async {
sharedPreferences = await SharedPreferences.getInstance();
}
static dynamic getData({
required String key
}) {
return sharedPreferences.get(key);
}
static Future<bool> saveData({
required String key,
required dynamic value,
}) async {
if(value is String) return await sharedPreferences.setString(key, value);
if(value is int) return await sharedPreferences.setInt(key, value);
if(value is bool) return await sharedPreferences.setBool(key, value);
return await sharedPreferences.setDouble(key, value);
}
static Future<bool> removeData({required String key}) async
{
return await sharedPreferences.remove(key);
}
}
حفظ البيانات اثناء عملية تسجيل الدخول
الان بعد تهيئة الملف نقوم بالانتقال الى المجلد الذي نريد القيام بالاختبار من خلاله ونتاكد اذا كانت الحاله صحيحه نقوم بتخزين البيانات وفقط هنا نحتاج الى التوكن الخاص بالمستخدم وخزينه بداخل الSharedPreferences كما هو موضح ليصبح محفوظ لدينا .
save data
CashHelper.saveData(
key: 'token', value: states.loginModel!.data!.token)
.then((value) {
navigateFinish(context, HomeScreen());
});
حفظ البيانات اثناء عملية تخطي شاشة البداية
نفس العملية السابقة سوف نقوم بها هنا ولكن لو نلاحظ ان عملية التخطي تحدث عندما يتم النقر على زر skip من الappbar او الانتقال الى اخر صفحة من الviewpage لذلك بدلا من كتابة الكود مرتين سوف نضعه بداخل methode ونستدعيها عند الحاجه وهنا تم استدعائها عند النقر على زر تخطي الموجود في اعلى شريط الappbar وايضا عند النقر على الزر الذي يظهر في اخر صفحة من الpagewview لكي يتخطي هذة العملية وينتقل الى العملية التي تليها .
void skip() {
CashHelper.saveData(key: 'onBoarding', value: true).then((value) {
if (value) {
navigateFinish(context , LoginScreen());
}
});
بدء تشغيل cacheHelper عند فتح التطبيق
الان عن دعملية فتح التطبيق سوف نقوم بالتاكد انه يوجد قيم في الSharedPreferences ام لا وعلى حسب القيم الموجوده ينقله الى الصفحة المطلوب وهنا قمنا بعمل اختبار اذا كانت هناك قيمة بداخل الtoken وبداخل الonboarding هذا يعني انه قام بعملية تسجيل دخول ناجحه وتخطى صفحة البداية لذلك ينقله على صفحة المتجر مباشرة واذا كانت هناك فيمة في الonboarding ولم يكن قيمة في التوكن هذا يدل على انه تخطي البداية ولم يقم بعملية تسجيل دخول لذلك ينقله على تسجيل الدخول .
void main() async{
WidgetsFlutterBinding.ensureInitialized();
Bloc.observer = MyBlocObserver();
DioHelper.init();
await CashHelper.init();
Widget widget;
bool onBoarding = CashHelper.getData(key: 'onBoarding') == null ? false : CashHelper.getData(key: 'onBoarding');
dynamic token = CashHelper.getData(key: 'token') == null ? null : CashHelper.getData(key: 'token');
print(token);
print(onBoarding);
if (onBoarding == true) {
if (token != null) {
widget = HomeScreen();
print(token);
} else
widget = LoginScreen();
} else
widget = OnBoardingScreen();
print(onBoarding);
runApp(MyApp(
startWidget: widget,
));
}
class MyApp extends StatelessWidget {
final Widget startWidget;
MyApp({required this.startWidget});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: lightTheme,
darkTheme: darkTheme,
themeMode: ThemeMode.light,
home: startWidget,
);
}
}