[Flutter] 만보기 3 work manager 사용

류재성's avatar
May 18, 2024
[Flutter] 만보기 3 work manager 사용
 
 

1. workmanager 라이브러리란?

 
💡
workmanager는 Flutter 애플리케이션에서 백그라운드 작업을 예약하고 실행할 수 있게 해주는 라이브러리이다. 이 라이브러리는 Android의 WorkManager API와 iOS의 BackgroundTasks API를 래핑하여 플랫폼 간 백그라운드 작업을 보다 쉽게 관리할 수 있게 도와준다. 이를 통해 일정한 주기로 작업을 실행하거나 특정 조건에서 작업을 수행할 수 있다.
 
 

2. 라이브러리 설치

 
pubspec.yaml
notion image
 
라이브러리 설치 후 pub get 을 누른다.
 

3. 적용하기

 
main.dart
import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:project_app/ui/callback_dispatcher.dart'; import 'package:workmanager/workmanager.dart'; import '_core/constants/http.dart'; import '_core/constants/move.dart'; import '_core/constants/theme.dart'; GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); void main() { //초기화 및 주기적인 백그라운드 작업 등록 WidgetsFlutterBinding.ensureInitialized(); Workmanager().initialize(callbackDispatcher, isInDebugMode: true); Workmanager().registerPeriodicTask( "1", fetchBackground, frequency: Duration(minutes: 15),); dio.interceptors.add(interceptor); runApp(ProviderScope(child: const MyApp())); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( navigatorKey: navigatorKey, // context가 없는 곳에서 context를 사용할 수 있는 방법 debugShowCheckedModeBanner: false, initialRoute: Move.welcomePage, routes: getRouters(), theme: theme(), // home: const WelcomePage(), // ); } }
 
💡
workmanager 의 최소 통신 단위는 15. callbackDispatcher 에 작성한 코드를 백그라운드로 실행한다.
 
callback_dispatcher.dart
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:project_app/ui/main/activity/pages/step_count_detail_page.dart'; import 'package:workmanager/workmanager.dart'; import '../_core/constants/http.dart'; import 'main/activity/viewmodel/walking_detail.viewmodel.dart'; const fetchBackground = "fetchBackground"; void callbackDispatcher() { Workmanager().executeTask((task, inputData) async { switch (task) { case fetchBackground: // 걸음 수를 서버에 전송하는 로직 String? stepsString = await secureStorage.read(key: 'current_steps'); int steps = int.tryParse(stepsString ?? '0') ?? 0; final container = ProviderContainer(); await container.read(WalkingDetailProvider.notifier).sendStepsToServer(steps); break; } return Future.value(true); }); }
 
💡
callbackDispatcher 에 만보기 데이터를 백그라운드에 작동할 수 있도록 통신 코드를 작성한다.
Share article
RSSPowered by inblog