Есть ли опыт нативной разработки?

Ответ

Да, у меня есть опыт нативной разработки под Android (Kotlin) и iOS (Swift), что помогает в создании плагинов для Flutter и решении специфичных для платформы задач.

Пример интеграции: При разработке одного из приложений мне потребовалось получить уровень заряда батареи. Я реализовал это через MethodChannel.

Код на стороне Flutter (Dart):

import 'package:flutter/services.dart';

static const platform = MethodChannel('samples.flutter.dev/battery');

Future<int> _getBatteryLevel() async {
  int batteryLevel;
  try {
    final result = await platform.invokeMethod('getBatteryLevel');
    batteryLevel = result;
  } on PlatformException catch (e) {
    // Обработка ошибок нативной платформы
    batteryLevel = -1;
  }
  return batteryLevel;
}

Код на стороне Android (Kotlin):

import android.content.Context
import android.content.Context.BATTERY_SERVICE
import android.os.BatteryManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "samples.flutter.dev/battery"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            call, result ->
            if (call.method == "getBatteryLevel") {
                val batteryLevel = getBatteryLevel()
                if (batteryLevel != -1) {
                    result.success(batteryLevel)
                } else {
                    result.error("UNAVAILABLE", "Battery level not available.", null)
                }
            } else {
                result.notImplemented()
            }
        }
    }

    private fun getBatteryLevel(): Int {
        val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    }
}

Такой опыт позволяет писать более эффективные и глубоко интегрированные с платформой Flutter-приложения.

Ответ 18+ 🔞

А, ну это же про нативку! Да, у меня с этим опытом всё в порядке, ёпта. И на Android под Kotlin ковырялся, и на iOS под Swift. Это ж, блядь, как раз то, что нужно, когда пишешь плагины для Flutter или когда надо решить какую-нибудь хитрожопую задачу, специфичную для платформы. Без этого — нихуя не выйдет, просто будешь в воздухе руками махать.

Вот, смотри, реальный пример из жизни, как я интеграцию делал. Понадобилось мне в одном приложении узнать, сколько батарейки осталось, уровень заряда. Ну, стандартная история. Сделал я это через MethodChannel. Честно говоря, иногда проще нативно написать, чем искать готовый плагин, который ещё и сломаться может.

Вот так это выглядит со стороны Flutter (Dart):

import 'package:flutter/services.dart';

static const platform = MethodChannel('samples.flutter.dev/battery');

Future<int> _getBatteryLevel() async {
  int batteryLevel;
  try {
    final result = await platform.invokeMethod('getBatteryLevel');
    batteryLevel = result;
  } on PlatformException catch (e) {
    // Обработка ошибок нативной платформы
    batteryLevel = -1;
  }
  return batteryLevel;
}

Всё просто, вызываем метод и ждём ответа. Главное — не забыть про ошибки, а то нативная платформа может и плюнуть в лицо исключением, если что не так.

А вот это уже кухня на Android (Kotlin):

import android.content.Context
import android.content.Context.BATTERY_SERVICE
import android.os.BatteryManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "samples.flutter.dev/battery"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            call, result ->
            if (call.method == "getBatteryLevel") {
                val batteryLevel = getBatteryLevel()
                if (batteryLevel != -1) {
                    result.success(batteryLevel)
                } else {
                    result.error("UNAVAILABLE", "Battery level not available.", null)
                }
            } else {
                result.notImplemented()
            }
        }
    }

    private fun getBatteryLevel(): Int {
        val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
    }
}

Вот и вся магия. Создаёшь канал, вешаешь обработчик, а внутри уже делаешь что душе угодно — батарейку опросишь, сенсоры почитаешь, или вообще нативный интерфейс покажешь. Без такого скила писать под Flutter — это как ехать на машине без колёс, вроде и движок есть, а толку — ноль, ебать. А с опытом нативной разработки приложения получаются куда более шустрые и глубоко заточенные под железо.