삼성 헬스에서는 걸음수가 증가하는데, 내가 만든 Flutter 앱 투또에서는 걸음수가 전혀 반응하지 않고 있다.
아무리 커서ai에게 수정하도록 요구했지만 토큰만 소모 할 뿐, 제자리 걸음만 반복되고 있었다.

수정을 요청 할 때마다 한걸음씩 원하는 목표에 다가서는 느낌이 들었지만, 결과적으로 보면 쓸모없는(쓸수 없는) 기능으로 만보기를 구현하려고 붙들고 있었다.
한 2시간 지켜보다 결국 구글링을 시작했다. “플러터 만보기 만들기” 검색하니 바로 답이 나왔다.
안드로이드 health 패키지를 다룰게 아니라 pedometer 패키지 사용하여야 했었다. 아래는 커서 ai 가 어떻게 삽질을 하다 결국 원하는 만보기 기능을 구현시켰는지 정리했다. 플러터 앱에 만보기 기능을 생각하고 있다면 한번 확인해 보시길.
커서 AI가 기능 구현까지의 과정을 요약해뒀다.
하드웨어 센서와의 연동.
Flutter로 걸음수 측정 앱을 만들 때 가장 큰 난관은 실제 하드웨어 센서와의 연동입니다.
일반적인 실패 패턴
// ❌ 잘못된 접근법
Timer.periodic(Duration(seconds: 5), (timer) {
_currentSteps += Random().nextInt(30); // 가짜 데이터
});이렇게 하면 사용자가 걸어도 앱에서 반영되지 않습니다.
1. 올바른 패키지 선택의 중요성
❌ 처음 시도한 방법:
dependencies:
health: ^13.1.1 # 특정 시점 데이터만 가져옴✅ 최종 선택한 방법:
dependencies:
pedometer: ^4.1.1 # 실시간 스트림 제공
health: ^13.1.1 # 보조 데이터용2. 핵심 인사이트
pedometer: 시스템 센서의 실시간 스트림 (327 likes, 9.97k downloads)health: Google Fit, Samsung Health 연동 (보조)- 이중 백업 시스템이 핵심!
⚡ 전 (구현 과정)
1. 실시간 걸음수 스트림 구현
class StepMissionService {
Stream<StepCount>? _stepCountStream;
StreamSubscription<StepCount>? _stepCountSubscription;
/// Pedometer 실시간 스트림 초기화
Future<void> _initializePedometer() async {
try {
print('📱 Pedometer 실시간 걸음수 스트림 초기화...');
// Pedometer 스트림 가져오기
_stepCountStream = Pedometer.stepCountStream;
// 스트림 구독 시작
_stepCountSubscription = _stepCountStream?.listen(
_onPedometerStepCount,
onError: _onPedometerError,
);
_pedometerAvailable = true;
print('✅ Pedometer 실시간 스트림 시작됨');
} catch (e) {
print('❌ Pedometer 초기화 실패: $e');
_pedometerAvailable = false;
}
}
}2. 핵심 로직: 오늘 걸음수 계산
/// Pedometer 걸음수 변화 처리
void _onPedometerStepCount(StepCount event) {
try {
final now = DateTime.now();
final todayKey = now.toIso8601String().split('T')[0];
// 날짜가 바뀌었으면 리셋
if (_todayDateKey != todayKey) {
_resetForNewDay(todayKey);
_todayStartSteps = event.steps; // 새로운 날의 시작점 설정
}
// 시스템 전체 걸음수 업데이트
_systemTotalSteps = event.steps;
// 🎯 핵심: 오늘 걸음수 = 시스템 전체 걸음수 - 오늘 시작점
final todaySteps = _systemTotalSteps - _todayStartSteps;
if (todaySteps >= 0 && todaySteps != _currentSteps) {
_currentSteps = todaySteps;
_lastUpdateTime = now;
print('🚶 실시간 걸음수 업데이트: $todaySteps걸음');
// 로컬 저장 및 UI 업데이트
_saveLocalData();
_updateUI();
}
} catch (e) {
print('❌ Pedometer 걸음수 처리 오류: $e');
}
}3. 이중 백업 시스템
/// 오늘 걸음수 가져오기 (Health Connect - 보조)
Future<void> _fetchTodaySteps() async {
// 🎯 핵심: Pedometer가 작동 중이면 건너뛰기
if (_pedometerAvailable) {
print('📱 Pedometer가 활성화되어 Health Connect 조회를 건너뜁니다.');
return;
}
// Health Connect에서 보완 데이터 가져오기
// (Pedometer가 실패했을 때만 사용)
}4. Firebase READ 최적화
// 🎯 핵심: 캐싱으로 비용 절감
static const Duration _cacheValidDuration = Duration(minutes: 5);
Future<int> _calculateAvailableRewards() async {
// 캐시가 유효한 경우 Firebase READ 없이 계산
if (_lastFirebaseReadTime != null &&
DateTime.now().difference(_lastFirebaseReadTime!) < _cacheValidDuration) {
return _calculateAvailableRewardsFromCache();
}
// 캐시가 만료된 경우에만 Firebase에서 새로고침
await refreshFromFirebase();
return _calculateAvailableRewardsFromCache();
}성공 결과
1. 실시간 걸음수 감지 성공!
실시간 걸음수 업데이트: 351걸음 (전체: 351, 시작: 0)
실시간 걸음수 업데이트: 357걸음 (전체: 357, 시작: 0)
실시간 걸음수 업데이트: 358걸음 (전체: 358, 시작: 0)
...
실시간 걸음수 업데이트: 405걸음 (전체: 405, 시작: 0)2. 성능 최적화 달성
- 실시간 반응: 걸음과 동시에 UI 업데이트
- 배터리 효율: 백그라운드 상주 없이 시스템 센서 활용
3. 크로스 플랫폼 지원
- Android: Pedometer + Health Connect
- iOS: Pedometer + HealthKit
- 관리자 기능: 테스트용 걸음수 추가
💡 핵심 팁 & 포인트
1. 패키지 선택의 중요성
# ❌ 잘못된 선택
health: ^13.1.1 # 단독 사용 시 실시간 불가
# ✅ 올바른 선택
pedometer: ^4.1.1 # 실시간 스트림
health: ^13.1.1 # 보조 데이터2. 오늘 걸음수 계산 로직
// 핵심 공식
final todaySteps = _systemTotalSteps - _todayStartSteps;- 시스템 부팅 이후 전체 걸음수에서 오늘 시작점을 빼야 함
- 날짜 변경 시 자동 리셋 필수
3. 이중 백업 시스템
// 주: Pedometer (실시간)
// 보조: Health Connect (앱 실행 시)
if (_pedometerAvailable) {
// Pedometer 사용
} else {
// Health Connect 사용
}4. Firebase 비용 최적화
// 5분 캐싱으로 READ 횟수 대폭 감소
static const Duration _cacheValidDuration = Duration(minutes: 5);5. 권한 설정
<!-- Android Manifest -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />실제 적용 시 주의사항
1. 안드로이드 권한
- Android 10+ 에서
ACTIVITY_RECOGNITION권한 필수 - 사용자가 거부해도 기본 센서는 작동 가능
2. iOS 설정
<!-- Info.plist -->
<key>NSMotionUsageDescription</key>
<string>This application tracks your steps</string>3. 디버깅 팁
// 로그로 센서 상태 확인
print('📱 Pedometer 상태: ${_pedometerAvailable ? "활성화" : "비활성화"}');
print('🔐 Health Connect 권한 상태: $_healthPermissionGranted');4. 성능 최적화
- 스트림 구독 해제 필수:
_stepCountSubscription?.cancel() - 메모리 누수 방지:
dispose()메서드 구현
결론
Flutter로 실시간 걸음수 측정을 구현할 때 가장 중요한 것은:
- 올바른 패키지 선택 (
pedometer+health) - 이중 백업 시스템 구축
- 오늘 걸음수 계산 로직 정확히 구현
- Firebase 비용 최적화 (캐싱 활용)
- 크로스 플랫폼 고려
이렇게 구현하면 사용자가 실제로 걸을 때마다 앱에서 실시간으로 반영되는 완벽한 걸음수 측정 기능을 만들 수 있습니다!

마치며 – 앱 출시까지 한걸음
애플이 요구했던 마지막 퍼즐, 유저에게 직접 보상을 주지 않도록 특정 수행을 마쳐서 보상을 받도록 하는 만보기 기능을 성공적으로 만들었다.
커서 AI가 똑똑하긴 하지만, 100% 신뢰하지 말고 구글 검색을 적절히 참고해야 함을 느꼈다. 누군가 만들어둔 기능을 따라서 만든다면 더욱이 구글 검색을 참고하자.





