くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

FlutterのAppLifecycleState/ConnectivityをRiverpodであつかえるようにする

flutter_hooksuseAppLifecycleState()もあるけど、
RiverpodのProvider内でも扱いたいなと思い、
いろいろ調べたときの備忘録(*´ω`*)

この記事がすごく参考になった!

AppLifecycleState

import 'package:flutter/material.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'app_lifecycle_provider.g.dart';

// providerの実装
@Riverpod(keepAlive: true)
AppLifecycleState appLifecycle(AppLifecycleRef ref) {
  // WidgetsBindingObserverを用意
  final observer = _AppLifecycleObserver(
    // うけっとたら、providerのstateに設定
    (appLifecycleState) => ref.state = appLifecycleState,
  );

  // widgetsBindingへobserverの追加
  final widgetsBinding = WidgetsBinding.instance;
  widgetsBinding.addObserver(observer);
  
  // dispose時にobserverを削除
  ref.onDispose(() => widgetsBinding.removeObserver(observer));

  // 初期値はresumedにしておく
  return AppLifecycleState.resumed;
}

/// WidgetsBindingObserverの実装
class _AppLifecycleObserver extends WidgetsBindingObserver {
  final ValueChanged<AppLifecycleState> _didChangeAppLifecycle;

  _AppLifecycleObserver(this._didChangeAppLifecycle);

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    _didChangeAppLifecycle(state);
    super.didChangeAppLifecycleState(state);
  }
}

Connectivity

ネットワークの接続状態を確認するconnectivity_plusもProvider化
こっちはすごくシンプル(*´ω`*)

import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'app_connectivity_provider.g.dart';

@riverpod
Stream<List<ConnectivityResult>> connectivity(ConnectivityRef ref) =>
    Connectivity().onConnectivityChanged;

以上!! これは便利だ。。(*´ω`*)

参考にしたサイトさま