العودة لقائمة المشاريع

مبرمج Flutter لتجميع ورفع تطبيق أدوات PDF على متجري App Store و Google Play عالمياً

56

نقاط الجدية مشروع جاد

من 100 — بناءً على نشاط صاحب المشروع، جودة الوصف، الميزانية، والعروض
الحالة
مُغلق
تاريخ النشر
منذ شهر
الميزانية
$250.00 - $500.00
مدة التنفيذ
7 أيام
التصنيف
برمجة، تطوير المواقع والتطبيقات
صاحب المشروع
ناشي م.
عدد العروض
19
مشاريع قيد التنفيذ
0
التواصلات الجارية
0
المهارات المطلوبة
flutter برمجة التطبيقات تصميم تطبيقات تطوير التطبيقات تطوير البرمجيات flutter برمجة التطبيقات تصميم تطبيقات تطوير التطبيقات تطوير البرمجيات
الوصف
نص تفاصيل المشروع والأكواد (انسخ من هنا): عنوان المشروع: مطلوب مبرمج Flutter لتجميع ورفع تطبيق أدوات PDF على متجري App Store و Google Play عالمياً تفاصيل المشروع: السلام عليكم ورحمة الله وبركاته، لدي مشروع تطبيق متكامل لأدوات الـ PDF (يحتوي على: مسح ضوئي، دمج، ضغط، توقيع ملون وعادي، شاشة اشتراكات ودفع، وشاشة إعدادات وحساب). التطبيق مبني باستخدام إطار عمل Flutter ليعمل على النظامين (iOS و Android) والهواتف والأجهزة اللوحية. الأكواد البرمجية الأساسية للواجهات والخدمات (Front-end & Services) جاهزة ومكتوبة بالكامل ومرفقة أدناه. والمطلوب من المبرمج هو تجميعها، ربطها، واختبارها ثم رفعها على حسابات المطورين الخاصة بي. ? أولاً: الأكواد البرمجية الكاملة للتطبيق --- 1. ملف main.dart --- Dart import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'PDF Tools Ultra', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.deepPurple, useMaterial3: true, ), home: const Scaffold( body: Center(child: Text('جاري تحميل التطبيق...')), ), ); } } --- 2. ملف home_screen.dart --- Dart import 'package:flutter/material.dart'; class HomeScreen extends StatelessWidget { const HomeScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('حقيبة أدوات PDF', style: TextStyle(fontWeight: FontWeight.bold)), centerTitle: true, elevation: 0, backgroundColor: Colors.white, foregroundColor: Colors.black, ), body: Padding( padding: const EdgeInsets.all(16.0), child: GridView.count( crossAxisCount: 2, crossAxisSpacing: 16, mainAxisSpacing: 16, children: [ _buildToolCard(Icons.document_scanner, 'مسح ضوئي', Colors.blue), _buildToolCard(Icons.merge_type, 'دمج ملفات PDF', Colors.green), _buildToolCard(Icons.compress, 'ضغط ملف PDF', Colors.orange), _buildToolCard(Icons.draw, 'توقيع المستند', Colors.purple), ], ), ), ); } Widget _buildToolCard(IconData icon, String title, Color color) { return Card( elevation: 4, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), child: InkWell( onTap: () {}, borderRadius: BorderRadius.circular(16), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon(icon, size: 50, color: color), const SizedBox(height: 12), Text(title, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), ], ), ), ); } } --- 3. ملف scanner_service.dart --- Dart import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; class ScannerService { final ImagePicker _picker = ImagePicker(); // فتح الكاميرا لمسح المستندات ضوئياً async Future<File?> scanDocument(BuildContext context) async { final XFile? photo = await _picker.pickImage(source: ImageSource.camera, imageQuality: 85); if (photo != null) { return File(photo.path); } return null; } } --- 4. ملف paywall_screen.dart --- Dart import 'package:flutter/material.dart'; class PaywallScreen extends StatelessWidget { const PaywallScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: SafeArea( child: Padding( padding: const EdgeInsets.all(24.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Icon(Icons.star, size: 80, color: Colors.amber), const SizedBox(height: 16), const Text('اشترك في النسخة الكاملة', textAlign: TextAlign.center, style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), const SizedBox(height: 24), _buildPlanCard('الاشتراك الشهري', '19.99 ريال / شهرياً', 'تجديد تلقائي'), const SizedBox(height: 12), _buildPlanCard('الاشتراك السنوي', '149.99 ريال / سنوياً', 'توفير 40% + 3 أيام تجربة مجانية'), const Spacer(), ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: const Color(0xff6200EE), padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), ), onPressed: () {}, child: const Text('اشترك الآن', style: TextStyle(color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold)), ), ], ), ), ), ); } Widget _buildPlanCard(String title, String price, String sub) { return Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( border: Border.all(color: Colors.grey.shade300, width: 2), borderRadius: BorderRadius.circular(12), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), Text(price, style: const TextStyle(fontSize: 16, color: Colors.green, fontWeight: FontWeight.w600)), Text(sub, style: const TextStyle(fontSize: 12, color: Colors.grey)), ], ), ); } } --- 5. ملف pdf_service.dart --- Dart import 'dart:io'; class PdfService { // محرك دمج ملفات PDF متعددة async Future<File?> mergePdfFiles(List<File> files) async { // كود الدمج البرمجي عبر مكتبة معالجة الملفات محلياً return null; } // محرك ضغط حجم ملفات PDF async Future<File?> compressPdfFile(File file) async { // كود تقليل الحجم والمعالجة المحلية return null; } } --- 6. ملف signature_screen.dart --- Dart import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:signature/signature.dart'; class SignatureScreen extends StatefulWidget { const SignatureScreen({super.key}); @override State<SignatureScreen> createState() => _SignatureScreenState(); } class _SignatureScreenState extends State<SignatureScreen> { late SignatureController _controller; Color _selectedColor = Colors.black; double _strokeWidth = 4.0; @override void initState() { super.initState(); _initController(); } void _initController() { _controller = SignatureController( penStrokeWidth: _strokeWidth, penColor: _selectedColor, exportBackgroundColor: Colors.transparent, ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('إنشاء توقيعك الخاص', style: TextStyle(fontWeight: FontWeight.bold)), backgroundColor: Colors.white, foregroundColor: Colors.black, elevation: 0, actions: [ IconButton(icon: const Icon(Icons.clear, color: Colors.red), onPressed: () => _controller.clear()) ], ), body: Column( children: [ Expanded( child: Container( margin: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.grey.withOpacity(0.05), borderRadius: BorderRadius.circular(16), border: Border.all(color: Colors.grey.shade300), ), child: Signature(controller: _controller, backgroundColor: Colors.transparent), ), ), Padding( padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ _buildColorButton(Colors.black, 'عادي'), const SizedBox(width: 8), _buildColorButton(Colors.blue, 'أزرق'), const SizedBox(width: 8), _buildColorButton(Colors.red, 'أحمر'), ], ), ElevatedButton.icon( style: ElevatedButton.styleFrom(backgroundColor: const Color(0xff6200EE)), icon: const Icon(Icons.check, color: Colors.white), label: const Text('اعتماد التوقيع', style: TextStyle(color: Colors.white)), onPressed: () async { if (_controller.isNotEmpty) { final Uint8List? signatureData = await _controller.toPngBytes(); if (signatureData != null) { Navigator.pop(context, signatureData); } } }, ), ], ), ), ], ), ); } Widget _buildColorButton(Color color, String label) { bool isSelected = _selectedColor == color; return InkWell( onTap: () { setState(() { _selectedColor = color; _controller = SignatureController(penStrokeWidth: _strokeWidth, penColor: _selectedColor, exportBackgroundColor: Colors.transparent, points: _controller.points); }); }, child: Chip(backgroundColor: isSelected ? color : Colors.grey.shade200, label: Text(label, style: TextStyle(color: isSelected ? Colors.white : Colors.black87))), ); } } --- 7. ملف profile_screen.dart --- Dart import 'package:flutter/material.dart'; class ProfileScreen extends StatelessWidget { const ProfileScreen({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('الإعدادات والحساب'), centerTitle: true, backgroundColor: Colors.white, foregroundColor: Colors.black, elevation: 0), body: ListView( padding: const EdgeInsets.all(16), children: [ Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration(color: const Color(0xff6200EE).withOpacity(0.05), borderRadius: BorderRadius.circular(16)), child: Row( children: [ const CircleAvatar(radius: 30, backgroundColor: Color(0xff6200EE), child: Icon(Icons.person, color: Colors.white)), const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text('مستخدم التطبيق', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), Container(padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), decoration: BoxDecoration(color: Colors.amber, borderRadius: BorderRadius.circular(12)), child: const Text('العضوية المميزة', style: TextStyle(fontSize: 12))), ], ) ], ), ), const SizedBox(height: 24), ListTile(leading: const Icon(Icons.language), title: const Text('لغة التطبيق'), subtitle: const Text('العربية')), ListTile(leading: const Icon(Icons.contact_support_outlined), title: const Text('تواصل مع الدعم الفني')), ListTile(leading: const Icon(Icons.rate_review_outlined), title: const Text('تقييم التطبيق على المتجر')), ], ), ); } } ?️ ثانياً: قائمة الطلبات والشروط التقنية المحددة للمطور المطلوب من المبرمج المستلم للمشروع تنفيذ المهام التالية بدقة: تجميع وضبط المشروع: إنشاء مشروع Flutter جديد ونظيف، وتوزيع الأكواد الـ 7 المرفقة أعلاه في ملفاتها الخاصة داخل بنية المشروع بشكل منظم وقابل للتطوير مستقبلاً. ترتيب الـ Dependencies والمكتبات اللازمة (مثل مكتبة الكاميرا، معالجة الـ PDF، ومكتبة الرسم والتوقيع) وحل أي تعارض في النسخ. التصميم المتجاوب (Responsive Layout): ضبط واجهات الشاشات الـ 5 لتكون متجاوبة (Responsive) تماماً لتعمل بكفاءة وسلاسة على الهواتف والأجهزة اللوحية (iPad & Android Tablets) مع مراعاة تناسق العناصر والأزرار. تعدد اللغات والدول المستهدفة (ASO & Localization): تهيئة التطبيق برمجياً ليدعم اللغات ديناميكياً (App Internationalization) مع دعم اتجاهات الواجهات (RTL و LTR) بناءً على لغة جهاز المستخدم أو لغة المتجر المحلي. ضبط التطبيق ليدعم النشر في عدة متاجر محددة: (المتجر السعودي، الإماراتي، الأمريكي، السويسري، الألماني، وبقية دول العالم). ربط نظام الاشتراكات وبوابات الدفع الرسمية (In-App Purchases): ربط شاشة الدفع والاشتراكات بنظام المتاجر الرسمي (أبل وجوجل) مباشرة أو عبر (RevenueCat). تفعيل خيار "الاشتراك الشهري" و "الاشتراك السنوي" مع تهيئة ميزة "الفترة التجريبية مجاناً لمدة 3 أيام" على الاشتراك السنوي. التأكد من ظهور خيارات الدفع المحلية والعالمية تلقائياً (مثل Apple Pay على الآيفون، و Google Pay والبطاقات الائتمانية والدفع عبر الفاتورة على الأندرويد). المعالجة المحلية والسرعة (Performance Optimization): التأكد من أن جميع عمليات دمج وضغط وتوقيع ملفات الـ PDF تتم محلياً على معالج جهاز المستخدم (On-Device Processing) لضمان السرعة الفائقة وحماية خصوصية البيانات. تفعيل ضغط برميجي لصور الكاميرا الملتقطة عبر الـ Scanner لضمان الحفاظ على صغر حجم ملف الـ PDF النهائي وسرعة مشاركته. الاختبار والتسليم النهائي: تزويدي بنسخة تجريبية للآيفون عبر TestFlight لفحصها، وملف APK لتجربة نسخة الأندرويد. ربط التطبيق بحسابات المطورين الخاصة بي (Apple Developer & Google Play Console). رفع وصف التطبيق وصور الشاشات المصممة باللغتين (العربية والإنجليزية) في الخانات المخصصة لكل متجر لتهيئة محركات البحث (ASO)، ثم تقديم التطبيق للمراجعة النهائية وقبوله في المتاجر. بانتظار عروضكم الاحترافية وشاكر لكم مقدماً.
عرض على مستقل