ImagePicker で try catch (e) を辞めた。【 Flutter 】
ImagePickerってパッケージ多分、Flutter民は使っているはずです。
なので、誰かの参考になるかもしれない、、、し、ならないかもしれない。それは知らん。
ということで、今回も備忘録。
try catch を辞める理由
は特にない。けど、なんとなく使わなくても良い方法ないかなぁ〜と模索した結果だった。
そう、普通に結果論。
でも、多分使った方が組織開発の時とかは便利かもしれない。知らんけど。
俺が使おうとしているもの↓(まだテスト段階)
非同期処理のエラーはonErrorが拾ってくれるし、
非同期処理成功時後のエラーはcatchErrorが拾ってくれる。
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メソッドの中にはエラー処理が盛り込まれていた。
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 {
...
} 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