Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gracefully handle File Not Exists #11

Open
awhitford opened this issue Jun 19, 2020 · 1 comment
Open

Gracefully handle File Not Exists #11

awhitford opened this issue Jun 19, 2020 · 1 comment

Comments

@awhitford
Copy link
Contributor

I have a scenario where a user may have uploaded a headshot image. There is no exists method for StorageReference, so the only way for one to really know if the user has an image is to try and download it. Alas, then I end up with messy stack traces, like:

flutter: ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════
flutter: The following PlatformException was thrown resolving an image codec:
flutter: PlatformException(Error -13010, FIRStorageErrorDomain, Object
flutter: headshots/QvCAc4WkJd8k0QthAUl1/headshot.jpg does not exist.)
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
flutter: #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18)
flutter: <asynchronous suspension>
flutter: #2      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:329:12)
flutter: #3      MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:356:48)
flutter: #4      StorageReference.getMetadata (package:firebase_storage/src/storage_reference.dart:162:10)
flutter: #5      FirebaseImageCacheManager.upsertRemoteFileToCache (package:firebase_image/src/cache_manager.dart:145:48)
flutter: #6      FirebaseImage._fetchImage (package:firebase_image/src/firebase_image.dart:93:36)
flutter: <asynchronous suspension>
flutter: #7      FirebaseImage._fetchImageCodec (package:firebase_image/src/firebase_image.dart:106:38)
flutter: #8      FirebaseImage.load (package:firebase_image/src/firebase_image.dart:117:18)
flutter: #9      ImageProvider.resolveStreamForKey.<anonymous closure> (package:flutter/src/painting/image_provider.dart:501:13)
flutter: #10     ImageCache.putIfAbsent (package:flutter/src/painting/image_cache.dart:359:22)
flutter: #11     ImageProvider.resolveStreamForKey (package:flutter/src/painting/image_provider.dart:499:80)
flutter: #12     ScrollAwareImageProvider.resolveStreamForKey (package:flutter/src/widgets/scroll_aware_image_provider.dart:106:19)
flutter: #13     ImageProvider.resolve.<anonymous closure> (package:flutter/src/painting/image_provider.dart:330:9)
flutter: #14     ImageProvider._createErrorHandlerAndKey.<anonymous closure>.<anonymous closure> (package:flutter/src/painting/image_provider.dart:460:26)
flutter: #15     SynchronousFuture.then (package:flutter/src/foundation/synchronous_future.dart:41:29)
flutter: #16     ImageProvider._createErrorHandlerAndKey.<anonymous closure> (package:flutter/src/painting/image_provider.dart:457:11)
flutter: #20     ImageProvider._createErrorHandlerAndKey (package:flutter/src/painting/image_provider.dart:449:16)
flutter: #21     ImageProvider.resolve (package:flutter/src/painting/image_provider.dart:327:5)
flutter: #22     _ImageState._resolveImage (package:flutter/src/widgets/image.dart:1099:16)
flutter: #23     _ImageState.didChangeDependencies (package:flutter/src/widgets/image.dart:1052:5)

(and it keeps going)

It appears that the getMetadata call is causing the Not Found Exception.

object.version = (await object.reference.getMetadata()).updatedTimeMillis;

Can something be done to suppress this extensive stack trace output? I would be open to passing a flag that indicated that a File not found is OK; or perhaps an onFileNotFound handler?

My code can really ignore it. The image, since it does not exist, is never provided, so my image place holder is simply never replaced. But the excessive stack traces are a huge distraction and it cries wolf.

@awhitford
Copy link
Contributor Author

My workaround is that my code first calls getMetadata and then it will only continue to call FirebaseImage when the metadata call succeeds. One redundant metadata call is a small price to pay.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant