Что такое PDD (Platform-Dependent Development) во Flutter?

«Что такое PDD (Platform-Dependent Development) во Flutter?» — вопрос из категории Other, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PDD (Platform-Dependent Development) во Flutter — это подход, при котором мы пишем платформо-специфичный код для доступа к нативным API или компонентам, которые не абстрагированы фреймворком. Это позволяет сохранять преимущества кроссплатформенности для UI-логики, но при необходимости использовать всю мощь iOS и Android.

Основные инструменты для PDD во Flutter:

  1. MethodChannel / EventChannel: Для вызова нативных методов и получения потоковых событий.
  2. PlatformView (UiKitView / AndroidView): Для встраивания нативных виджетов (например, карты Google/Apple, WebView) прямо в дерево виджетов Flutter.
  3. Платформо-специфичный код в папках android/ и ios/: Модификация MainActivity.kt, AppDelegate.swift и т.д.

Пример: Создание собственного плагина для вибрации через MethodChannel.

Dart-сторона (Flutter):

import 'package:flutter/services.dart';

class VibrationPlugin {
  static const platform = MethodChannel('com.example/vibration');

  static Future<void> vibrate(Duration duration) async {
    try {
      await platform.invokeMethod('vibrate', duration.inMilliseconds);
    } on PlatformException catch (e) {
      print("Не удалось вызвать вибрацию: ${e.message}");
    }
  }
}

Android-сторона (Kotlin в MainActivity.kt):

import android.os.Vibrator
import android.os.VibrationEffect
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val channel = "com.example/vibration"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel).setMethodCallHandler {
            call, result ->
            if (call.method == "vibrate") {
                val ms = call.arguments as Long
                val vibrator = getSystemService(Vibrator::class.java)
                vibrator.vibrate(VibrationEffect.createOneShot(ms, VibrationEffect.DEFAULT_AMPLITUDE))
                result.success(null)
            } else {
                result.notImplemented()
            }
        }
    }
}

Когда это нужно:

  • Интеграция со специфичными сервисами (Apple Pay, Google Play Billing).
  • Использование аппаратных датчиков, не охваченных стандартными плагинами.
  • Встраивание сложных нативных UI-компонентов. Сила Flutter в гибридном подходе: 90% кода — кроссплатформенный Dart, 10% — PDD для критически важной нативной функциональности.