Flutter:Firebase 存储图像上传的延迟初始化错误
Flutter: Late Initialization Error for Fire Base Storage Image Upload
我正在尝试允许登录用户将个人资料图片上传到他们的主页。在我将 uploadImage
函数添加到我的代码之前,我能够以用户身份成功登录并在页面顶部打印用户的电子邮件以证明他们确实已登录。现在我已经添加了个人资料图片上传程序代码,当我以用户身份登录时出现以下红屏错误:
LateInitializedError: Field 'imageUrl' has not been initialized.
我已经给 imageUrl Late modifier
认为这将允许代码 运行 并稍后在 运行 中分配变量,但这并没有解决问题。我需要帮助让变量可以为 null,直到用户可以上传他们自己的图片。这是我观看的视频,以了解如何开始此过程:
这是我的代码:
import 'dart:io';
import 'package:commentaries/net/authentication.dart';
import 'package:commentaries/ui/nav.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
class UserPage extends StatefulWidget {
const UserPage({Key? key}) : super(key: key);
@override
_UserPageState createState() => _UserPageState();
}
class _UserPageState extends State<UserPage> {
User user = auth.currentUser!;
late String imageUrl; // A: USER PROFILE PICTURE
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('${user.email}'),
),
body: Column(
children: [
(imageUrl != null)
? Image.network(imageUrl)
: const Placeholder(
fallbackHeight: 200.0, fallbackWidth: double.infinity),
const SizedBox(
height: 20.0,
),
ElevatedButton(
child: const Text('Upload Image'),
onPressed: () => uploadImage(),
),
// A: LOGOUT USER HERE
TextButton(
child: const Text('Logout'),
// this removes all previous routes and returns signed out user to the home tab (sign in screen)
onPressed: () => signOut().then(
(_) => Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (context) => const Nav()),
(Route<dynamic> route) => false),
),
// onPressed:(){
// auth.signOut();
// Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => Nav()));
// },
),
],
),
);
}
uploadImage() async {
final _storage = FirebaseStorage.instance;
final _picker = ImagePicker();
PickedFile image;
// A: Check permissions
await Permission.photos.request();
var permissionStatus = await Permission.photos.status;
if (permissionStatus.isGranted) {
// A: Select Image
// A: future picked file, add await clarification
image = (await _picker.pickImage(source: ImageSource.gallery)) as PickedFile;
var file = File(image.path);
if (image != null) {
// A: Upload to firebase
var snapshot = await _storage
.ref()
.child('folderName/imageName') // will create folder: folderName and image: imageName
.putFile(file);
var downloadUrl = await snapshot.ref.getDownloadURL();
setState(() {
imageUrl = downloadUrl;
});
} else {
print('No path recieved, no image detected');
}
} else {
print('App is not permitted to access photo gallery');
}
}
}
将 rickimaru 的解决方案发布为社区 wiki 以提高知名度:
您需要将 late String imageUrl
替换为 String? imageUrl
以修复初始化错误。
我正在尝试允许登录用户将个人资料图片上传到他们的主页。在我将 uploadImage
函数添加到我的代码之前,我能够以用户身份成功登录并在页面顶部打印用户的电子邮件以证明他们确实已登录。现在我已经添加了个人资料图片上传程序代码,当我以用户身份登录时出现以下红屏错误:
LateInitializedError: Field 'imageUrl' has not been initialized.
我已经给 imageUrl Late modifier
认为这将允许代码 运行 并稍后在 运行 中分配变量,但这并没有解决问题。我需要帮助让变量可以为 null,直到用户可以上传他们自己的图片。这是我观看的视频,以了解如何开始此过程:
这是我的代码:
import 'dart:io';
import 'package:commentaries/net/authentication.dart';
import 'package:commentaries/ui/nav.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
class UserPage extends StatefulWidget {
const UserPage({Key? key}) : super(key: key);
@override
_UserPageState createState() => _UserPageState();
}
class _UserPageState extends State<UserPage> {
User user = auth.currentUser!;
late String imageUrl; // A: USER PROFILE PICTURE
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('${user.email}'),
),
body: Column(
children: [
(imageUrl != null)
? Image.network(imageUrl)
: const Placeholder(
fallbackHeight: 200.0, fallbackWidth: double.infinity),
const SizedBox(
height: 20.0,
),
ElevatedButton(
child: const Text('Upload Image'),
onPressed: () => uploadImage(),
),
// A: LOGOUT USER HERE
TextButton(
child: const Text('Logout'),
// this removes all previous routes and returns signed out user to the home tab (sign in screen)
onPressed: () => signOut().then(
(_) => Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (context) => const Nav()),
(Route<dynamic> route) => false),
),
// onPressed:(){
// auth.signOut();
// Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => Nav()));
// },
),
],
),
);
}
uploadImage() async {
final _storage = FirebaseStorage.instance;
final _picker = ImagePicker();
PickedFile image;
// A: Check permissions
await Permission.photos.request();
var permissionStatus = await Permission.photos.status;
if (permissionStatus.isGranted) {
// A: Select Image
// A: future picked file, add await clarification
image = (await _picker.pickImage(source: ImageSource.gallery)) as PickedFile;
var file = File(image.path);
if (image != null) {
// A: Upload to firebase
var snapshot = await _storage
.ref()
.child('folderName/imageName') // will create folder: folderName and image: imageName
.putFile(file);
var downloadUrl = await snapshot.ref.getDownloadURL();
setState(() {
imageUrl = downloadUrl;
});
} else {
print('No path recieved, no image detected');
}
} else {
print('App is not permitted to access photo gallery');
}
}
}
将 rickimaru 的解决方案发布为社区 wiki 以提高知名度:
您需要将 late String imageUrl
替换为 String? imageUrl
以修复初始化错误。