📚

ImagePicker で try catch (e) を辞めた。【 Flutter 】

2023/02/01に公開

ImagePickerってパッケージ多分、Flutter民は使っているはずです。

なので、誰かの参考になるかもしれない、、、し、ならないかもしれない。それは知らん。

ということで、今回も備忘録。

try catch を辞める理由

は特にない。けど、なんとなく使わなくても良い方法ないかなぁ〜と模索した結果だった。
そう、普通に結果論。

でも、多分使った方が組織開発の時とかは便利かもしれない。知らんけど。

俺が使おうとしているもの↓(まだテスト段階)

非同期処理のエラーはonErrorが拾ってくれるし、
非同期処理成功時後のエラーはcatchErrorが拾ってくれる。

dart
	return await imagePicker
          .pickImage(
              source: isGallery ? ImageSource.gallery : ImageSource.camera)
          .then((value) {
        Navigator.pop(context);
        return value;
      }).catchError((error) {
        if (kDebugMode) {
          print('☠☠☠ catchError 発生 ☠☠☠');
          print('error: $error');
        }
        Navigator.pop(context);
        SD.unKnownError(context);
        return null;
      }).onError((error, stackTrace) {
        if (kDebugMode) {
          print('☠☠☠ onError 発生 ☠☠☠');
          print('error: $error');
          print('stackTrace: $stackTrace');
        }

        Navigator.pop(context);
        SD.unKnownError(context);
        return null;
      });

でも、ここで問題点が・・・

pickeImageメソッドの中にはエラー処理が盛り込まれていた。

pickImage Error処理
    if (imageQuality != null && (imageQuality < 0 || imageQuality > 100)) {
      throw ArgumentError.value(
          imageQuality, 'imageQuality', 'must be between 0 and 100');
    }
    if (maxWidth != null && maxWidth < 0) {
      throw ArgumentError.value(maxWidth, 'maxWidth', 'cannot be negative');
    }
    if (maxHeight != null && maxHeight < 0) {
      throw ArgumentError.value(maxHeight, 'maxHeight', 'cannot be negative');
    }

もし、ここで躓く可能性があるなら、try catch をした方が良い気がする。
理由は分からんけど。デバッグとかしてると、確実にtry catchではエラーを教えてくれるから。

<軽い追記>
というか、リリースモードでやろうが、デバッグでやろうが、上記のエラーはtry catchでしかキャッチしてくれなかった。悲しい。
でも、こんな謎の変数とか突っ込まないし、問題ない。

追記:やっぱり try catch を使うなり

やっぱ、try catch って良いよね〜〜

ほら、なんか形が良さそうじゃん。俺やっぱこっち使うわ〜〜〜〜。

(...手のひら返し)

(...秘技、燕返し)

理由:PlatformExceptionのcodeでphoto_access_deniedが使えるから。

ImagePickerで権限を否認された時って、どうするのか
それをずっと考えていた。
それの解決策として提案されていたのが、permission_handlerのパッケージを使うみたいなのが沢山出てたけど、使い勝手がよく分からず辞めた。

で、色々とエラーを探っていると、try catch には、
間にPlatformExceptionを入れることが出来るらしい。知らなんだ。

try catch 文
try { 
  ...
} on PlatformException catch (err) {
  print('error code: ${err.code}');
  Navigator.pop(context);
} catch (e) {
  print('error: $e');
  Navigator.pop(context);
}

これで、err.codeを開いてみると
photo_access_denied ← こいつがあった。

あぁ、これは便利。これ使えば楽に解決できた。

Discussion