import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; const _deviceChannel = MethodChannel('kr.co.fanuzu.app/device'); /// Android API 레벨 — 한 번 읽어 둔다. Android 가 아니거나 채널이 없으면(위젯 테스트) null. Future? _sdkInt; /// 클립보드에 [text] 를 넣고, OS 가 복사를 직접 알리지 않을 때만 [toast] 를 부른다. /// /// Android 13(API 33)+ 는 시스템이 「클립보드에 복사했어요」를 띄워 앱 토스트와 겹친다 /// (10/8 r11 3-8). iOS · Android 12 이하는 앱이 알린다. Future copyToClipboard(String text, VoidCallback toast) async { await Clipboard.setData(ClipboardData(text: text)); if (defaultTargetPlatform == TargetPlatform.android && ((await (_sdkInt ??= _readSdkInt())) ?? 0) >= 33) { return; } toast(); } Future _readSdkInt() async { try { return await _deviceChannel.invokeMethod('sdkInt'); } on Object { return null; } } @visibleForTesting void resetClipboardSdkCache() => _sdkInt = null;