我正在尝试从 firebase 存储中获取图像并将其显示在我的 flutter 应用程序中,但我收到错误“所需参考处不存在对象”。所有图像都存储在根目录中。我还更改了 firebase 规则以允许在无需身份验证的情况下进行读写。 这是我的代码。
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:firebase_storage/firebase_storage.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Wallpaper App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: WallpaperScreen(),
);
}
}
class WallpaperScreen extends StatefulWidget {
@override
_WallpaperScreenState createState() => _WallpaperScreenState();
}
class _WallpaperScreenState extends State<WallpaperScreen> {
List<String> imageUrls = []; // Store fetched image URLs
@override
void initState() {
super.initState();
fetchImages();
}
Future<void> fetchImages() async {
try {
final storageRef = FirebaseStorage.instance.ref();
final result = await storageRef.listAll();
for (var item in result.items) {
try {
final url = await item.getDownloadURL();
setState(() {
imageUrls.add(url);
});
} catch (error) {
print("Error fetching URL");
}
}
} catch (e) {
print("Error fetching images: $e");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Wallpapers'),
),
body: GridView.builder(
itemCount: imageUrls.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 4.0,
mainAxisSpacing: 4.0,
),
itemBuilder: (BuildContext context, int index) {
return Image.network(
imageUrls[index], // Load image from URL
fit: BoxFit.cover,
);
},
),
);
}
}
Firebase Storage 中的错误“所需引用处不存在对象”通常表示您提供的路径与存储桶中的任何对象不对应。以下是一些需要检查和排除故障的事项:
检查 Firebase 存储路径:确保您提供给
FirebaseStorage.instance.ref()
的路径与 Firebase 存储中存储图像的路径匹配。你提到你的图像存储在根目录中,所以路径确实应该是正确的。
验证 Firebase 存储规则:尽管您提到您已将 Firebase 存储规则设置为允许在无需身份验证的情况下进行读写,但最好仔细检查它们以确保它们配置正确。以下是允许公共读取所有文件的规则示例:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read;
allow write: if false; // or any other conditions for write operations
}
}
}
fetchImages()
中的 catch 块: } catch (error) {
print("Error fetching URL: $error");
}
这样,如果获取下载 URL 时出现任何问题,您可以看到确切的错误消息。
main()
函数中完成了此操作,但最好仔细检查一下。如果您已验证上述所有内容但仍然遇到问题,请尝试检查 Firebase 控制台是否有任何错误日志或可能有助于查明问题的其他信息。另外,请确保您的 Firebase 项目已正确设置并链接到您的 Flutter 应用。