WEBサイト制作・アプリ開発・システム開発・ブランディングデザイン制作に関するご相談はお気軽にご連絡ください。
構想段階からじっくりとヒアリングし、お客様の課題にあわせたアプローチ手法でお客様の“欲しかった”をカタチにしてご提案いたします。
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('設定を開く'),
),
],
),
);
}
}
ここで権限を管理するシングルトンクラスを作っています。権限管理だけではシングルトンクラスにする意味は薄いので、欲しい権限と関連する機能をここで設置しましょう。
これで簡単に必須権限の許可をユーザに訴求できるようになりました。良かったですね。