seong

Flutter - Android 뒤로가기 버튼 클릭을 홈버튼과 동일한 효과 내기 본문

Flutter/Flutter

Flutter - Android 뒤로가기 버튼 클릭을 홈버튼과 동일한 효과 내기

hyeonseong 2024. 9. 19. 11:14

Android에서 뒤로가기 버튼 클릭시 앱을 종료 하는게 아니라, 백그라운드에서 계속 실행 해둬야 하는 경우가 생길 수 있다.

이때 Android에서 moveTaskToBack이라는 함수가 있어서, 메서드 채널로 구현할 수 있다.

1. PopScope로 뒤로가기를 감지 하고, 함수에서 더블 클릭 시 메서드 채널로 요청

PopScope(
    canPop: false,
    onPopInvoked: (bool didPop) {
      onWillPop();
    },
   child:Scaffold();
   );


Future<bool> onWillPop() async {
    DateTime now = DateTime.now();
    if (backPressTime == null ||
        now.difference(backPressTime!) > const Duration(seconds: 2)) {
      backPressTime = now;
      // Fluttertoast.showToast(msg: MyApp.localization..exitButton);
      return false;
    }
    await AndroidMethodChannel().moveTaskToBack();
    return Future.value(true);
  }

2. Android메서드 채널 

class AndroidMethodChannel {
  static final AndroidMethodChannel _singleton = AndroidMethodChannel._();

  factory AndroidMethodChannel() {
    return _singleton;
  }
  AndroidMethodChannel._();

  var methodChannel = const MethodChannel("android");
  Future<void> moveTaskToBack() async {
    await methodChannel.invokeMethod("moveTaskToBack");
  }
}

3. 메서드 채널로 요청 받아 moveTaskToBack 함수를 실행

class MainActivity : FlutterActivity(), NotificationHandlerListener {
    lateinit var methodChannel: MethodChannel
    private  val TAG = "MainActivity"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "android")
        methodChannel.setMethodCallHandler { call, result ->
            when (call.method) {
                "moveTaskToBack" -> {
                    moveTaskToBack(true)
                }
            }
        }
    }

}