Blog スタッフブログ

Flutter システム開発 ひとくちコードスニペット

[Flutter]アプリがアクティブになった際に設定を開くコードスニペット

こんにちは、株式会社MIXシステム開発担当のBloomです。

今回はFlutterで利用できるコードスニペットを紹介します。今回はアプリで必須の権限がある時などで、アプリがアクティブ状態になった際に強制的に権限などの確認を行ったのち、権限が許可されていない場合に設定画面へ遷移させます。

まずはパッケージのインストールから行いましょう。ここではアプリの設定画面を開くためのパッケージのみを指定しています。

flutter pub add app_settings

では、いよいよコードを実装しましょう。まずは権限確認を行う画面へこれを実装します。

/* 前略 */

class PermissionCheck extends StatefulWidget {
  const PermissionCheck({super.key});

  @override
  State<RequestList> createState() => _PermissionCheck();
}

class _PermissionCheck extends State<PermissionCheck> with WidgetsBindingObserver {
  bool isShownAppSetting = false;
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

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

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed:
        if (isShownAppSetting == true) {
          isShownAppSetting = false;
          checkPermission();
        }
        break;
      case AppLifecycleState.inactive:
      case AppLifecycleState.paused:
      case AppLifecycleState.detached:
      case AppLifecycleState.hidden:
        break;
    }
  }

  void checkPermission() {
    PermissonManager().showSettingDialogIfNeeded(context, (opened) {
      isShownAppSetting = opened;
    });
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    checkPermission();
  }
}

ここでは、didChangeDependenciesで初回の権限の確認を行うほか、アプリケーションがアクティブになった時かつ設定アプリから戻ってきた際に権限確認を再度行わせる実装を行っています。

/* 前略 */

class PermissionManager {
  // シングルトンインスタンス
  static final PermissionManager _instance = PermissionManager._internal();

  factory PermissionManager() => _instance;

  PermissionManager._internal();

  Future<void> initialize() async {}

  Future<bool> showSettingDialogIfNeeded(BuildContext context, Function(bool) onOpened) async {
    if (/* ここで権限を確認しましょう */) {
      _showSettingsDialog(context, onOpened);
      return true;
    }
    return false;
  }
  Future<void> _showSettingsDialog(BuildContext context, Function(bool) onOpened) async {
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text('権限が必要です'),
        content: Text(
            'ここに権限が必要な理由を書きましょう'),
        actions: [
          TextButton(
            onPressed: () {
              Navigator.of(context).pop();
              AppSettings.openAppSettings();
              onOpened(true);
            },
            child: Text('設定を開く'),
          ),
        ],
      ),
    );
  }
}

ここで権限を管理するシングルトンクラスを作っています。権限管理だけではシングルトンクラスにする意味は薄いので、欲しい権限と関連する機能をここで設置しましょう。

これで簡単に必須権限の許可をユーザに訴求できるようになりました。良かったですね。