Balbas Code

Dartでのフォアグラウンド遷移時に関数を呼ぶ

公開日: 2024-06-08 18:21:17

Dartでフォアグラウンドに戻ってきた際に起動させるコードを触ったので、自分的メモのために記載しておきます。
流れ的にはこちらのようになっております。


再びアプリを起動

Flutterのライフサイクルイベントがトリガーされる

UserViewModelの`didChangeAppLifecycleState`が呼ばれる

UserViewModelの`onResume`が呼ばれる

UserViewModelの`checkLevelDownState`が呼ばれる

通知をリスナーに送信 (`notifyListeners`)

UIが更新される (必要に応じて)

ProviderでUserViewModelの変更を検知、取得し、画面に表示(HomeScreen側)



user_view_model.dart


import 'package:flutter/material.dart';

class UserViewModel extends ChangeNotifier with WidgetsBindingObserver {
String level = "0";

UserViewModel() {
// ウィジェットのバインディングにこのクラスをオブザーバーとして追加
WidgetsBinding.instance.addObserver(this);
}

@override
void dispose() {
// ウィジェットのバインディングからこのクラスをオブザーバーとして削除
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// アプリのライフサイクルが変更されたときに呼び出される
if (state == AppLifecycleState.resumed) {
// アプリがフォアグラウンドに戻ったときの処理を呼び出す
onResume();
}
}

void onResume() {
// アプリがフォアグラウンドに戻ったときの処理をここに記載
checkLevelDownState();
}

void checkLevelDownState() {
// レベルダウン状態のチェック処理
// 例えば、レベルを更新するなどの処理
notifyListeners(); // リスナーに状態が変更されたことを通知
}
}

 


HomeScreen.dart(タブの親View)


import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:badges/badges.dart' as badges;
import '../viewmodel/user_view_model.dart';

class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
int _currentIndex = 0;

void onTabTapped(int index) {
setState(() {
_currentIndex = index;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: IndexedStack(
index: _currentIndex,
children: [
Center(child: Text('Bulletin Board')),
Center(child: Text('Post')),
Center(child: Text('Settings')),
],
),
),
bottomNavigationBar: Consumer<UserViewModel>(
builder: (context, userViewModel, child) {
return BottomNavigationBar(
onTap: onTabTapped,
currentIndex: _currentIndex,
items: [
const BottomNavigationBarItem(
icon: Icon(Icons.dashboard),
label: 'Bulletin Board',
),
BottomNavigationBarItem(
icon: badges.Badge(
showBadge: userViewModel.level == "1",
badgeContent: Text('1', style: TextStyle(color: Colors.white)),
child: Icon(Icons.post_add),
),
label: 'Post',
),
BottomNavigationBarItem(
icon: badges.Badge(
showBadge: userViewModel.level == "4",
badgeContent: Text('1', style: TextStyle(color: Colors.white)),
child: Icon(Icons.settings),
),
label: 'Settings',
),
],
);
},
),
);
}
}



こちらを実行することで、再度アプリが起動した時に狙った関数等を呼び出せます。