如何解决不明白为什么我在使用 image_picker 时遇到这个错误
我在这里得到的唯一错误是代码 File selectedImage;
并且错误指出“必须初始化不可为空的实例字段‘selectedImage’。尝试添加初始化表达式,或初始化它的生成构造函数,或将其标记为“迟到”。
这是我的代码:
import 'dart:io';
import 'package:tennis_event_app/services/crud.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:random_string/random_string.dart';
class CreateBlog extends StatefulWidget {
@override
_CreateBlogState createState() => _CreateBlogState();
}
class _CreateBlogState extends State<CreateBlog> {
//
File selectedImage;
final picker = ImagePicker();
bool isLoading = false;
CrudMethods crudMethods = new CrudMethods();
Future getImage() async {
final pickedFile = await picker.getImage(source: ImageSource.gallery);
setState(() {
if (pickedFile != null) {
selectedImage = File(pickedFile.path);
} else {
print('No image selected.');
}
});
}
Future<void> uploadBlog() async {
if (selectedImage != null) {
// upload the image
setState(() {
isLoading = true;
});
Reference firebaseStorageRef = FirebaseStorage.instance
.ref()
.child("blogImages")
.child("${randomAlphaNumeric(9)}.jpg");
final UploadTask task = firebaseStorageRef.putFile(selectedImage);
var imageUrl;
await task.whenComplete(() async {
try {
imageUrl = await firebaseStorageRef.getDownloadURL();
} catch (onError) {
print("Error");
}
print(imageUrl);
});
// print(downloadUrl);
Map<String,dynamic> blogData = {
"imgUrl": imageUrl,"author": authorTextEditingController.text,"title": titleTextEditingController.text,"desc": descTextEditingController.text
};
crudMethods.addData(blogData).then((value) {
setState(() {
isLoading = false;
});
Navigator.pop(context);
});
// upload the blog info
}
}
//
TextEditingController titleTextEditingController =
new TextEditingController();
TextEditingController descTextEditingController = new TextEditingController();
TextEditingController authorTextEditingController =
new TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Create Blog"),actions: [
GestureDetector(
onTap: () {
uploadBlog();
},child: Padding(
padding: EdgeInsets.symmetric(horizontal: 16),child: Icon(Icons.file_upload)),)
],),body: isLoading
? Container(
child: Center(
child: CircularProgressIndicator(),))
: SingleChildScrollView(
child: Container(
margin: EdgeInsets.symmetric(horizontal: 16),child: Column(
children: [
GestureDetector(
onTap: () {
getImage();
},child: selectedImage != null
? Container(
height: 150,margin: EdgeInsets.symmetric(vertical: 24),width: MediaQuery.of(context).size.width,child: ClipRRect(
borderRadius:
BorderRadius.all(Radius.circular(8)),child: Image.file(
selectedImage,fit: BoxFit.cover,)
: Container(
height: 150,decoration: BoxDecoration(
color: Colors.grey,borderRadius:
BorderRadius.all(Radius.circular(8))),child: Icon(
Icons.camera_alt,color: Colors.white,TextField(
controller: titleTextEditingController,decoration: InputDecoration(hintText: "enter title"),TextField(
controller: descTextEditingController,decoration: InputDecoration(hintText: "enter desc"),TextField(
controller: authorTextEditingController,decoration:
InputDecoration(hintText: "enter author name"),],)),);
}
}
我也收到了两个警告,但不确定这里是否真的有问题。这是第 37 行和第 118 行的警告,“操作数不能为空,因此条件始终为真。”
任何帮助将不胜感激,我已经坚持了两天!
解决方法
看来您正在使用空安全。所以问题是 File selectedImage
被标记为不可为空,但你没有在构造函数中初始化它。尝试将其替换为 File? selectedImage
或 late File selectedImage
。
在第 37 和 118 行删除 !因为没有必要。
我建议您阅读https://flutter.dev/docs/null-safety,因为它有很详细的解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。