Workstation Logo
مصنوعات
AI لیبزOpenAI ایجنٹسClaude ایجنٹسGrok BotWorkstation CRM (WSL CRM)مارکیٹنگتمام مصنوعات
AI حل
AI ورک سٹیشنزAI SME Packagesپرائیویٹ AIGPU کلسٹرزایج AIانٹرپرائز AI لیبصنعت کے مطابق AI
خدمات
Platform ModernisationDigital EngineeringData Foundations & AIAutonomous OperationsAI مشاورتDevOps آٹومیشنسائبر سیکیورٹیسافٹ ویئر ڈیولپمنٹایجنٹ بلڈنگMLOps سیٹ اپ
ہمارے بارے میں
شراکت دارگاہکوں کی کہانیاں
مضامین
دستاویزات
WSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7
بلاگ
ہم سے رابطہ کریںLogin
Workstation

جدید کاروبار کے لیے AI ورک اسٹیشنز، AI ملٹی ایجنٹک سافٹ ویئر، GPU انفراسٹرکچر اور ذہین ایجنٹ حل۔

ہم سے رابطہ کریں

AI حل

AI ورک سٹیشنزAI SME Packagesپرائیویٹ AIGPU کلسٹرزایج AIانٹرپرائز AI لیبصنعت کے مطابق AI

مصنوعات

تمام مصنوعاتWSL CRM اور ERPمارکیٹنگOpenAI ایجنٹسWSL ProxyRing PromoterWSL VaultJobshoutSysOps 24/7

کمپنی

ہمارے بارے میںWorkstation کیوںشراکت دارگاہکوں کی کہانیاںقیمتیںرابطہ

وسائل

مضامیندستاویزاتبلاگتلاشسائٹ میپ
برطانیہ آفس
77-79 Marlowes, Hemel Hempstead HP1 1LFراستہ - M25 آؤٹر لندن سے جنکشن 20 لیںکمپنی نمبر: 11641870پیر - جمعہ: صبح 9:00 - شام 6:00 GMT
+44 7515 356 146
بیلجیم آفس
Workstation SRL, Rue Vanderkindere 34, 1180 Uccle, BrusselsBE 0751.518.683پیر - جمعہ: صبح 9:00 - شام 6:00 CET
+32 492 45 67 46
بھارت آفس
#159 Sector 9, Pocket 1, DDA Flats, 110077 Dwarka, New Delhi
+91 98881 98841

© 2026 Workstation AI۔ جملہ حقوق محفوظ ہیں۔

رازداریکوکیزسروس کی شرائطویب سائٹ سائٹ میپ

Loading blog...

Home / Blog
MysqlNode.jsBackend

Flutter میں مہارت حاصل کرنا: پروڈکشن کے لیے تیار موبائل ایپلیکیشنز بنانا

Flutter اور Dart کے ساتھ مضبوط، توسیع پذیر موبائل ایپلیکیشنز بنانے کے لیے ایک مکمل گائیڈ

Balinder Walia27 مئی، 202510 min read

Flutter پروٹو ٹائپ بنانا آسان ہے۔ ایک پروڈکشن کے لیے تیار Flutter ایپلیکیشن کی تعمیر کے لیے جو پیمانہ بناتی ہے، بوجھ کے نیچے اچھی کارکردگی کا مظاہرہ کرتی ہے، اور برسوں تک برقرار رکھنے کے لیے فن تعمیر، ریاستی انتظام، جانچ، اور تعیناتی کے کام کے بہاؤ کی بہت گہری سمجھ کی ضرورت ہوتی ہے۔ یہ گائیڈ ٹیوٹوریل پروجیکٹس اور حقیقی دنیا کی ایپلی کیشنز کے درمیان فرق کو ختم کرتا ہے، جس میں ان نمونوں اور طریقوں کا احاطہ کیا جاتا ہے جن پر پیشہ ورانہ Flutter ٹیمیں ہر روز انحصار کرتی ہیں۔

Flutter

کے لیے کلین آرکیٹیکچر کلین آرکیٹیکچر آپ کی ایپلیکیشن کو واضح حدود اور انحصار کے اصولوں کے ساتھ الگ الگ تہوں میں الگ کرتا ہے۔ یہ علیحدگی آپ کے کوڈ کو قابل جانچ، قابل برقرار، اور بیرونی فریم ورک اور ٹولز سے آزاد بناتی ہے۔

Flutter آرکیٹیکچر پرتیںآپ کا ڈارٹ کوڈبزنس لاجک & UI کمپوزیشنFlutter فریم ورکوجیٹسرینڈرنگفاؤنڈیشن (اشارے، anim) XTAG23

TAG3X (C++)سکیا گرافکس • ڈارٹ رن ٹائم • پلیٹ فارم چینلزiOS (UIKit)ARM / Apple SiliconAndroid (NDK)ARM / x86

TAG9

TAG09

پرت کا ڈھانچہ

ایک پروڈکشن Flutter ایپ عام طور پر تین پرتوں والے فن تعمیر کی پیروی کرتی ہے:

  • پریزنٹیشن لیئر- وجیٹس، صفحات، اور ریاست کا نظم و نسق یہ پرت ڈومین پرت پر منحصر ہے لیکن کبھی بھی براہ راست ڈیٹا کے ذرائع پر نہیں۔
  • ڈومین لیئر- کاروباری منطق، اداروں اور استعمال کے معاملات۔ اس پرت کا Flutter یا کسی بیرونی پیکجز پر صفر انحصار ہے۔ یہ ریپوزٹری انٹرفیس (خلاصہ کلاسز) کی وضاحت کرتا ہے جسے ڈیٹا لیئر لاگو کرتا ہے۔
  • ڈیٹا لیئر- ریپوزٹری کے نفاذ، API کلائنٹس، مقامی ڈیٹا بیس تک رسائی، اور ڈیٹا ماڈلز (DTOs)۔ یہ پرت ڈومین پرت میں بیان کردہ انٹرفیس کو نافذ کرتی ہے۔
lib/
  core/
    error/
      exceptions.dart
      failures.dart
    network/
      network_info.dart
    usecases/
      usecase.dart
  features/
    authentication/
      data/
        datasources/
          auth_remote_datasource.dart
          auth_local_datasource.dart
        models/
          user_model.dart
        repositories/
          auth_repository_impl.dart
      domain/
        entities/
          user.dart
        repositories/
          auth_repository.dart
        usecases/
          login.dart
          register.dart
          logout.dart
      presentation/
        bloc/
          auth_bloc.dart
          auth_event.dart
          auth_state.dart
        pages/
          login_page.dart
          register_page.dart
        widgets/
          login_form.dart

انحصار کا قاعدہ سخت ہے: اندرونی پرتیں کبھی بھی بیرونی تہوں کے بارے میں نہیں جانتی ہیں۔ ڈومین پرت تجریدی ریپوزٹری انٹرفیس کی وضاحت کرتی ہے، اور ڈیٹا لیئر ٹھوس نفاذ فراہم کرتی ہے۔ کنٹرول کا یہ الٹا آپ کو کاروباری منطق کو چھوئے بغیر ڈیٹا کے ذرائع کو تبدیل کرنے کی اجازت دیتا ہے۔

اسٹیٹ مینجمنٹ: BLoC اور Riverpod

ریاست کے انتظام کے صحیح حل کا انتخاب ایک Flutter پروجیکٹ میں سب سے زیادہ اثر انگیز تعمیراتی فیصلوں میں سے ایک ہے۔

BLoC پیٹرن

BLoC (بزنس لاجک اجزاء) ریاست کا نظم کرنے کے لیے اسٹریمز کا استعمال کرتا ہے۔ واقعات اندر آتے ہیں، ریاستیں نکلتی ہیں۔ یہ یک طرفہ ڈیٹا کا بہاؤ ریاستی تبدیلیوں کو قابل قیاس اور ڈیبگ کرنے میں آسان بناتا ہے۔

// Events
abstract class AuthEvent {}

class LoginRequested extends AuthEvent {
  final String email;
  final String password;
  LoginRequested({required this.email, required this.password});
}

class LogoutRequested extends AuthEvent {}

// States
abstract class AuthState {}

class AuthInitial extends AuthState {}
class AuthLoading extends AuthState {}
class AuthAuthenticated extends AuthState {
  final User user;
  AuthAuthenticated(this.user);
}
class AuthError extends AuthState {
  final String message;
  AuthError(this.message);
}

// BLoC
class AuthBloc extends Bloc<AuthEvent, AuthState> {
  final LoginUseCase loginUseCase;
  final LogoutUseCase logoutUseCase;

  AuthBloc({
    required this.loginUseCase,
    required this.logoutUseCase,
  }) : super(AuthInitial()) {
    on<LoginRequested>(_onLoginRequested);
    on<LogoutRequested>(_onLogoutRequested);
  }

  Future<void> _onLoginRequested(
    LoginRequested event,
    Emitter<AuthState> emit,
  ) async {
    emit(AuthLoading());
    final result = await loginUseCase(
      LoginParams(email: event.email, password: event.password),
    );
    result.fold(
      (failure) => emit(AuthError(failure.message)),
      (user) => emit(AuthAuthenticated(user)),
    );
  }

  Future<void> _onLogoutRequested(
    LogoutRequested event,
    Emitter<AuthState> emit,
  ) async {
    await logoutUseCase();
    emit(AuthInitial());
  }
}

Riverpod

Riverpod ریاستی نظم و نسق کے لیے زیادہ لچکدار، مرتب کرنے کے لیے محفوظ طریقہ پیش کرتا ہے۔ فراہم کنندہ کے برعکس، Riverpod ویجیٹ کے درخت پر منحصر نہیں ہے، جس سے اسے جانچنا اور تحریر کرنا آسان ہو جاتا ہے۔

// Define providers
final authRepositoryProvider = Provider<AuthRepository>((ref) {
  return AuthRepositoryImpl(
    remoteDatasource: ref.read(authRemoteDatasourceProvider),
    localDatasource: ref.read(authLocalDatasourceProvider),
  );
});

final authStateProvider = StateNotifierProvider<AuthNotifier, AuthState>((ref) {
  return AuthNotifier(ref.read(authRepositoryProvider));
});

class AuthNotifier extends StateNotifier<AuthState> {
  final AuthRepository _repository;

  AuthNotifier(this._repository) : super(const AuthState.initial());

  Future<void> login(String email, String password) async {
    state = const AuthState.loading();
    final result = await _repository.login(email, password);
    state = result.fold(
      (failure) => AuthState.error(failure.message),
      (user) => AuthState.authenticated(user),
    );
  }
}

// Use in widgets
class LoginPage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final authState = ref.watch(authStateProvider);
    return authState.when(
      initial: () => LoginForm(),
      loading: () => const CircularProgressIndicator(),
      authenticated: (user) => HomePage(user: user),
      error: (message) => ErrorDisplay(message: message),
    );
  }
}

انحصار انجیکشن

قابل انحصار کوڈ کے لیے مناسب انحصار انجیکشن ضروری ہے۔get_itپیکیج ایک سادہ سروس لوکیٹر فراہم کرتا ہے جو صاف فن تعمیر کے ساتھ اچھی طرح کام کرتا ہے۔

Flutter ویجیٹ ٹریمیٹریل ایپسکیفولڈXTAG08109XXTAG08AppBarلسٹ ویوFABTX125X ListTile 2
final sl = GetIt.instance;

void initDependencies() {
  // External
  sl.registerLazySingleton(() => Dio()..interceptors.add(AuthInterceptor()));
  sl.registerLazySingleton(() => InternetConnectionChecker());

  // Data sources
  sl.registerLazySingleton<AuthRemoteDatasource>(
    () => AuthRemoteDatasourceImpl(dio: sl()),
  );
  sl.registerLazySingleton<AuthLocalDatasource>(
    () => AuthLocalDatasourceImpl(secureStorage: sl()),
  );

  // Repositories
  sl.registerLazySingleton<AuthRepository>(
    () => AuthRepositoryImpl(
      remoteDatasource: sl(),
      localDatasource: sl(),
      networkInfo: sl(),
    ),
  );

  // Use cases
  sl.registerLazySingleton(() => LoginUseCase(sl()));
  sl.registerLazySingleton(() => RegisterUseCase(sl()));

  // BLoCs
  sl.registerFactory(() => AuthBloc(
    loginUseCase: sl(),
    logoutUseCase: sl(),
  ));
}

API Dio کے ساتھ انٹیگریشن

Dio ڈارٹ کے لیے سب سے زیادہ مقبول HTTP کلائنٹ ہے، جو انٹرسیپٹرز، عالمی کنفیگریشن اور سپورٹ ڈی ڈیٹا کی پیشکش کرتا ہے۔ اپنی API پرت کو ٹائپ سیف درخواست اور رسپانس ہینڈلنگ کے ساتھ تشکیل دیں۔

class ApiClient {
  final Dio _dio;

  ApiClient(this._dio) {
    _dio.options = BaseOptions(
      baseUrl: Environment.apiBaseUrl,
      connectTimeout: const Duration(seconds: 10),
      receiveTimeout: const Duration(seconds: 15),
      headers: {'Content-Type': 'application/json'},
    );

    _dio.interceptors.addAll([
      AuthInterceptor(),
      LogInterceptor(requestBody: true, responseBody: true),
      RetryInterceptor(dio: _dio, retries: 3),
    ]);
  }

  Future<T> get<T>(
    String path, {
    Map<String, dynamic>? queryParameters,
    required T Function(dynamic data) parser,
  }) async {
    try {
      final response = await _dio.get(path, queryParameters: queryParameters);
      return parser(response.data);
    } on DioException catch (e) {
      throw _handleError(e);
    }
  }

  AppException _handleError(DioException error) {
    switch (error.type) {
      case DioExceptionType.connectionTimeout:
      case DioExceptionType.receiveTimeout:
        return NetworkException('Connection timed out');
      case DioExceptionType.badResponse:
        return ServerException(
          error.response?.statusCode ?? 500,
          error.response?.data?['message'] ?? 'Unknown error',
        );
      default:
        return NetworkException('Network error occurred');
    }
  }
}

Hive اور Sqflite کے ساتھ لوکل سٹوریج

زیادہ تر پروڈکشن ایپس کو مقامی ڈیٹا کی مستقل مزاجی کی ضرورت ہوتی ہے۔ اپنے ڈیٹا کی پیچیدگی کی بنیاد پر صحیح ٹول کا انتخاب کریں۔

Hive برائے کلیدی قدر اور آبجیکٹ اسٹوریج

Hive ایک ہلکا پھلکا، تیز رفتار NoSQL ڈیٹا بیس ہے جو خالص ڈارٹ میں لکھا گیا ہے۔ یہ کیشنگ، صارف کی ترجیحات، اور چھوٹے سے درمیانے ڈیٹاسیٹس کو ذخیرہ کرنے کے لیے مثالی ہے۔ متعلقہ ڈیٹا کے لیے

@HiveType(typeId: 0)
class CachedArticle extends HiveObject {
  @HiveField(0)
  final String id;

  @HiveField(1)
  final String title;

  @HiveField(2)
  final String content;

  @HiveField(3)
  final DateTime cachedAt;

  CachedArticle({
    required this.id,
    required this.title,
    required this.content,
    required this.cachedAt,
  });
}

class ArticleCacheService {
  static const _boxName = 'articles_cache';

  Future<void> cacheArticles(List<Article> articles) async {
    final box = await Hive.openBox<CachedArticle>(_boxName);
    final cached = articles.map((a) => CachedArticle(
      id: a.id,
      title: a.title,
      content: a.content,
      cachedAt: DateTime.now(),
    ));
    await box.clear();
    await box.addAll(cached);
  }

  Future<List<CachedArticle>> getCachedArticles() async {
    final box = await Hive.openBox<CachedArticle>(_boxName);
    return box.values.toList();
  }
}

Sqflite

جب آپ کے ڈیٹا میں پیچیدہ تعلقات ہوتے ہیں اور آپ کو SQL سوالات کی ضرورت ہوتی ہے، تو Sqflite Flutter کے لیے مکمل SQLite نفاذ فراہم کرتا ہے۔ اسے منظم ڈیٹا کے لیے استعمال کریں جو جوائن، انڈیکسز اور لین دین سے فائدہ اٹھاتا ہے۔

پش نوٹیفیکیشنز

مناسب اجازت ہینڈلنگ اور بیک گراؤنڈ میسج پروسیسنگ کے ساتھ Firebase کلاؤڈ میسجنگ (FCM) کا استعمال کرتے ہوئے پش نوٹیفکیشنز کو نافذ کریں۔

class NotificationService {
  final FirebaseMessaging _messaging = FirebaseMessaging.instance;

  Future<void> initialize() async {
    // Request permission
    final settings = await _messaging.requestPermission(
      alert: true,
      badge: true,
      sound: true,
    );

    if (settings.authorizationStatus == AuthorizationStatus.authorized) {
      // Get FCM token
      final token = await _messaging.getToken();
      await _sendTokenToServer(token);

      // Listen for token refresh
      _messaging.onTokenRefresh.listen(_sendTokenToServer);

      // Handle foreground messages
      FirebaseMessaging.onMessage.listen(_handleForegroundMessage);

      // Handle background/terminated message taps
      FirebaseMessaging.onMessageOpenedApp.listen(_handleMessageTap);
    }
  }

  void _handleForegroundMessage(RemoteMessage message) {
    // Show local notification using flutter_local_notifications
    FlutterLocalNotificationsPlugin().show(
      message.hashCode,
      message.notification?.title,
      message.notification?.body,
      const NotificationDetails(
        android: AndroidNotificationDetails(
          'default_channel',
          'Default',
          importance: Importance.high,
        ),
      ),
    );
  }
}

ڈیپ لنکنگ

ڈیپ لنکنگ صارفین کو بیرونی URLs سے براہ راست آپ کی ایپ کے اندر مخصوص مواد پر نیویگیٹ کرنے کی اجازت دیتی ہے۔ Flutter URI پر مبنی گہری روابط اور متحرک روابط دونوں کو سپورٹ کرتا ہے۔

// Configure in MaterialApp
MaterialApp(
  onGenerateRoute: (settings) {
    final uri = Uri.parse(settings.name ?? '');

    if (uri.pathSegments.first == 'product') {
      final productId = uri.pathSegments[1];
      return MaterialPageRoute(
        builder: (_) => ProductDetailPage(id: productId),
      );
    }

    if (uri.pathSegments.first == 'order') {
      final orderId = uri.pathSegments[1];
      return MaterialPageRoute(
        builder: (_) => OrderTrackingPage(id: orderId),
      );
    }

    return MaterialPageRoute(builder: (_) => const HomePage());
  },
)

مزید مضبوط ڈیپ لنکنگ کے لیے،go_routerپیکیج کا استعمال کریں جو ڈیپ لنک سپورٹ، ری ڈائریکٹ، اور نیسٹڈ نیویگیشن کے ساتھ اعلانیہ روٹنگ فراہم کرتا ہے۔ کوڈ میجک اور فاسٹ لین کے ساتھ

CI/CD

خودکار تعمیر اور تعیناتی پائپ لائنز پروڈکشن ایپس کے لیے ضروری ہیں۔ Codemagic ایک Flutter- مقامی CI/CD سروس فراہم کرتا ہے، جبکہ Fastlane زیادہ حسب ضرورت آٹومیشن پیش کرتا ہے۔

Codemagic Configuration

# codemagic.yaml
workflows:
  production-release:
    name: Production Release
    max_build_duration: 60
    environment:
      flutter: stable
      vars:
        APP_STORE_CONNECT_KEY_ID: Encrypted(...)
        GOOGLE_PLAY_SERVICE_ACCOUNT: Encrypted(...)
    scripts:
      - name: Install dependencies
        script: flutter pub get
      - name: Run tests
        script: flutter test --coverage
      - name: Build Android
        script: flutter build appbundle --release
      - name: Build iOS
        script: |
          flutter build ipa --release \
            --export-options-plist=/path/to/ExportOptions.plist
    artifacts:
      - build/**/outputs/**/*.aab
      - build/ios/ipa/*.ipa
    publishing:
      google_play:
        credentials: $GOOGLE_PLAY_SERVICE_ACCOUNT
        track: internal
      app_store_connect:
        api_key: $APP_STORE_CONNECT_KEY_ID

فاسٹ لین انٹیگریشن

فاسٹ لین تعمیر اور جمع کرانے کے عمل پر دانے دار کنٹرول فراہم کرتا ہے۔ ریلیز کے مختلف مراحل کے لیے لین کی وضاحت کریں:

# fastlane/Fastfile
platform :ios do
  desc "Deploy to TestFlight"
  lane :beta do
    build_flutter_app(target: "lib/main.dart")
    upload_to_testflight(
      skip_waiting_for_build_processing: true
    )
  end

  desc "Deploy to App Store"
  lane :release do
    build_flutter_app(target: "lib/main.dart")
    upload_to_app_store(
      submit_for_review: true,
      automatic_release: false
    )
  end
end

پرفارمنس پروفائلنگ

پروڈکشن ایپس مسلسل کارکردگی کا مطالبہ کرتی ہیں۔ Flutter DevTools جامع پروفائلنگ کی صلاحیتیں فراہم کرتا ہے۔

  • ویجیٹ ری بلڈ ٹریکنگ- ضرورت سے زیادہ دوبارہ بنانے والے ویجٹس کی شناخت کے لیے پرفارمنس اوورلے اور DevTools کا استعمال کریں۔ دوبارہ تعمیرات کو کم سے کم کرنے کے لیےconstکنسٹرکٹرز اور منتخب ریاستی انتظام کا اطلاق کریں۔
  • فریم رینڈرنگ- 16ms (60fps) یا 8ms (120fps) کے اندر فریم رینڈر کو یقینی بنانے کے لیے ٹائم لائن ویو کی نگرانی کریں۔ مہنگی تعمیر، ترتیب، اور پینٹ کے مراحل تلاش کریں۔
  • میموری پروفائلنگ- لیکس کا پتہ لگانے کے لیے میموری ایلوکیشن کو ٹریک کریں۔ عام مجرموں میں غیر منسوخ شدہ سٹریم سبسکرپشنز، غیر ڈسپوزڈ کنٹرولرز، اور بند ہونے کے حوالے سے برقرار رکھے گئے حوالہ جات شامل ہیں۔
  • اسٹارٹ اپ پرفارمنس-WidgetsBinding.instance.addPostFrameCallbackکا استعمال کرتے ہوئے بھاری ابتدا کو موخر کریں۔ ایسی خصوصیات کے لیےdeferred asدرآمدات کے ساتھ موخر لوڈنگ کا استعمال کریں جن کی فوری ضرورت نہیں ہے۔
// Profile-mode build for accurate performance measurement
// flutter run --profile

// Add performance overlay in debug builds
MaterialApp(
  showPerformanceOverlay: true,
  // ...
)

نتیجہ

پروڈکشن کے لیے تیار Flutter ایپلی کیشنز کو ویجیٹ کیٹلاگ کو جاننے سے زیادہ کی ضرورت ہے۔ یہ سوچے سمجھے فن تعمیر، مضبوط ریاستی انتظام، جامع جانچ، اور خودکار تعیناتی پائپ لائنوں کا مطالبہ کرتا ہے۔ کلین آرکیٹیکچر کو اپنا کر، مناسب انحصار انجیکشن میں سرمایہ کاری کرکے، مکمل غلطی سے نمٹنے، اور CI/CD ورک فلو کو قائم کرکے، آپ ایسی ایپلی کیشنز تخلیق کرتے ہیں جو نہ صرف فعال ہیں بلکہ طویل مدت کے لیے برقرار رکھنے کے قابل اور توسیع پذیر ہیں۔

اپنے فن تعمیر کو ابتدائی طور پر قائم کرکے شروع کریں، پہلے دن سے ٹیسٹ لکھیں، اور اپنی پہلی ریلیز سے پہلے اپنی تعیناتی پائپ لائن کو خودکار بنائیں۔ یہ ابتدائی سرمایہ کاری وقت کے ساتھ ساتھ مل جاتی ہے، جو آپ کی ٹیم کو فیچرز کو کم رجعت اور ہر ریلیز میں زیادہ اعتماد کے ساتھ تیزی سے بھیجنے کے قابل بناتی ہے۔