iamport / iamport_flutter

Flutter App에서 아임포트 결제서비스 연동을 위한 모듈입니다.
MIT License
67 stars 36 forks source link

Android14 (SDK34) - OneUI 6.0 에서 발생하는 백화현상 임시 대응 #129

Open DevHyeon0312 opened 2 months ago

DevHyeon0312 commented 2 months ago

해당 처리기 백화현상은 일단 해결되며, 결제 프로세스 자체에 영향을 끼치지는 않는 것으로 보여집니다.

나름 화면 회전을 고려하여 Stack 을 사용한 init 화면 등의 처리를 했음에도, 회전되는 애니메이션에서 발생하는 시각적인 측면에서의 유저경험을 방해한다는 것은 부정할 수 없었습니다.

https://gist.github.com/DevHyeon0312/714c9890538812dd004fdbcd2fb0583b

-- 핵심 요약 --

class _YourWidgetState extends State<YourWidget>
    with WidgetsBindingObserver {
  bool isLandscape = false;
  ...

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    if (await _isSamsungIssueDevice()) {
      if (state == AppLifecycleState.resumed) {
        _showPortrait();
      } else if (state == AppLifecycleState.hidden) {
        _shouldLandScape();
      }
    }
  }

  Future<bool> _isSamsungIssueDevice() async {
    if (Platform.isAndroid) {
      /// DeviceInfoPlugin 을 사용하면 sdkIn 34, manufacturer samsung 일 경우에만 적용되도록 처리 가능합니다.
      /// (모든 Android 기기에서 이슈에 대한 처리를 하는 것은 비효율적이기 때문입니다.)
      // try {
      //   var androidInfo = await DeviceInfoPlugin().androidInfo;
      //   var sdkInt = androidInfo.version.sdkInt;
      //   var manufacturer = androidInfo.manufacturer;
      //   if (sdkInt == 34 && manufacturer == 'samsung') {
      //     return true;
      //   }
      // } catch (_) {}
      return true;
    }
    return false;
  }

  Future<void> _shouldLandScape() async {
    SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]);
    Future.delayed(const Duration(milliseconds: 500), () {
      setState(() {
        isLandscape = true;
      });
    });
  }

  Future<void> _showPortrait() async {
    SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
    Future.delayed(const Duration(milliseconds: 500), () {
      setState(() {
        isLandscape = false;
      });
    });
  }
  ...