如何解决在Firestore中创建记录时,小部件库错误捕获了异常
我正在从事在线公告板项目,我使用以下代码上传了通知,但上传工作正常,但出现以下错误。
class UploadNotice extends StatefulWidget {
@override
_UploadNoticeState createState() => _UploadNoticeState();
}
class _UploadNoticeState extends State<UploadNotice> {
final _formKey=GlobalKey<FormState>();
final List<String> noticrcategory=
['Exams','Mahapola/Bursary','TimeTables','Results','Other','General'];
File _noticepic;
String title;
String url;
String category;
String dateTime;
var uuid=Uuid();
bool loading = false;
DateTime now=new DateTime.now();
@override
Widget build(BuildContext context) {
Future getImage() async{
var image=await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
_noticepic=image;
print('image path: $_noticepic');
});
}
Future uploadPic(BuildContext context)async{
String fileName=basename(_noticepic.path);
final StorageReference firebaseStorageRef=FirebaseStorage()
.ref().child('notices/$fileName');
final StorageUploadTask uploadTask=firebaseStorageRef.putFile(_noticepic);
StorageTaskSnapshot taskSnapshot= await uploadTask.onComplete;
String downloadurl = await taskSnapshot.ref.getDownloadURL();
url=downloadurl.toString();
}
final user = Provider.of<User>(context);
return StreamBuilder(
stream:UserService(uid: user.uid).userData,builder: (context,snapshot){
User userData=snapshot.data;
String getDepartmentName(){
return userData.department.toString();
}
String department=getDepartmentName();
return loading ? Loading(): Scaffold(
appBar: AppBar(
elevation: 0.0,title: Text('Notices App',style: TextStyle(
fontFamily: 'Montserrat',fontWeight: FontWeight.bold,color: Colors.white,),backgroundColor: Colors.blue[800],body:SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),child: Form(
key: _formKey,child: Column(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),child: Container(child: Text('Add your notice here')
),Container(
child:(_noticepic!=null)?Image.file(_noticepic,fit: BoxFit.fill):
Image.asset('',height: 450.0,width:300.0,color: Colors.grey[400],Padding(
padding: const EdgeInsets.only(left: 280),child: Container(
child: IconButton(
icon: Icon(Icons.add_photo_alternate),color: Colors.grey[700],iconSize: 40,onPressed:(){
getImage().then((context){
uploadPic(context);
});
}
),TextFormField(
decoration: new InputDecoration(labelText: 'Title'),validator: (value) {
return value.isEmpty ? 'Title is Required' : null;
},onChanged: (value) {
setState(() => title = value);
}),DropdownButtonFormField(
value: category ?? 'General',items: noticrcategory.map((noticrcategory){
return DropdownMenuItem(
value: noticrcategory,child: Text('$noticrcategory Category'),);
}).toList(),onChanged: (value)=>setState(()=>category=value),Text('${now.day}/${now.month}/${now.year}'),SizedBox(height: 30.0,Container(
height: 30.0,width: 100.0,child: RaisedButton(
onPressed: () async {
setState(() => loading=true);
await NoticeService().updteNoticeData(
title,url,category,'unapproved',now,'$department',uuid.v4());
Navigator.of(context).pushReplacementNamed('/Upload Notices');
},child: Text('Upload',style: TextStyle(color: Colors.white),color: Colors.blue[700],)
],);
}
);
}
这是这里的代码,我可以将通知上传为图像,也可以将当前时间上传到Firestore。 firestore记录是通过此代码创建的。但是会出现以下错误。
════════ Exception caught by widgets library ═══════════════════════════════════
The getter 'department' was called on null.
Receiver: null
Tried calling: department
The relevant error-causing widget was
StreamBuilder<User>
lib\…\pages\uploadNotice.dart:56
════════════════════════════════════════════════════════════════════════════════
════════ Exception caught by image resource service ════════════════════════════
Unable to load asset:
════════════════════════════════════════════════════════════════════════════════
解决方法
userData
为空,您应该执行以下操作:
builder: (context,snapshot){
if(snapshot.hasData){
User userData = snapshot.data;
userData.department.toString();
return Text(userData.department.toString());
else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default,show a loading spinner.
return CircularProgressIndicator();
}
由于StreamBuilder
是异步的,因此首先显示一个加载小部件,然后使用hasData
检查是否返回了任何数据
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。