[Flutter] Hive DB로 내부저장소 사용하기 #3 DB 실시간 구독, 인터넷 없을 때 로컬 저장소 사용하기

S_Soo100·2023년 3월 24일
0

flutter

목록 보기
6/14
post-thumbnail

1. ValueListenable로 실시간 Hive Box 구독하기

  • 플러터 provider 등에 쓰는 valueListenable 개념을 써서 Hive Box안의 데이터를 실시간으로 구독하고, 화면에 반영할 수 있다. (아예 프로바이더랑 같이 써도 된다!) 쉽게 말해 박스랑 소켓통신 걸어두었다고 생각하자
  • box.listenable() 메서드는 해당 박스의 값들을 ValueListenable로 바꿔준다. 아래 코드는 공식문서의 예시 코드로, 앱을 다크모드, 라이트모드로 바꿔준다.
    void main() async {
      await Hive.initFlutter();
      await Hive.openBox('settings');
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Demo Settings',
          home: Scaffold(
            body: ValueListenableBuilder<Box>(
              valueListenable: Hive.box('settings').listenable(),
              builder: (context, box, widget) {
                return Center(
                  child: Switch(
                    value: box.get('darkMode', defaultValue: false),
                    onChanged: (val) {
                      box.put('darkMode', val);
                    },
                  ),
                );
              },
            ),
          ),
        );
      }
    }

2. 인터넷이 없을 때 임시 저장소로 사용하는 Hive

  • 플러터에는 모바일 기기의 인터넷 연결상태를 인식하는 Connectivity클래스를 지원한다. Connectivity클래스에서 checkConnectivity() 함수를 사용하면 ConnectivityResult 타입으로 연결 상태를 받을 수 있다.
    // Connectivity클래스 선언문
    class Connectivity {
      factory Connectivity() { //싱글톤이다.
        if (_singleton == null) {
          _singleton = Connectivity._();
        }
        return _singleton!;
      }
      Connectivity._();
      static Connectivity? _singleton;
      static ConnectivityPlatform get _platform => ConnectivityPlatform.instance;
    	
    	// Stream으로 받기
      Stream<ConnectivityResult> get onConnectivityChanged {
        return _platform.onConnectivityChanged;
      }
    	
    	//현재상태를 비동기 객체로 받기
    	Future<ConnectivityResult> checkConnectivity() {
        return _platform.checkConnectivity();
      }
    }
  • 이 클래스를 이용해서, 인터넷이 없을 때는 내부 저장소에 저장하고, 인터넷이 있으면 서버에 저장하는 식으로 앱 데이터 저장을 구현할 수 있다.
    	late Connectivity _connectivity;
    	late ConnectivityResult _result;
    	var box = await Hive.box('user');
    
    	Future<void> saveData(data) async {
    		_result = await _connectivity.checkConnectivity();
    		
    		if(_result == ConnectivityResult.none) {
    			await box.put(data.key, data.value);
    		} else{
    			await saveToServer(data);
    		}
    	}
profile
플러터, 리액트

0개의 댓글