无法解决因空安全而引起的这些错误
Can't get around these errors in flutter cause of null safety
itemCount: snapShot.data.length,
错误 - 无法无条件访问 属性 'length',因为接收者可以是 'null'。
尝试使访问有条件(使用'?.')或向目标添加空检查('!')。
DocumentSnapshot sliderImage = snapShot.data[index];
错误 - 无法无条件调用方法“[]”,因为接收者可以是 'null'。
尝试使调用有条件(使用'?.')或向目标添加空检查('!')。
地图getImage = sliderImage.data();
错误 - 类型 'Object?' 的值无法分配给类型 'Map<dynamic, dynamic>' 的变量。
尝试更改变量的类型,或将右侧类型转换为 'Map<dynamic, dynamic>'
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class ImageSlider extends StatefulWidget {
const ImageSlider({Key? key}) : super(key: key);
@override
_ImageSliderState createState() => _ImageSliderState();
}
class _ImageSliderState extends State<ImageSlider> {
Future getSliderImageFromDb() async {
var _fireStore = FirebaseFirestore.instance;
QuerySnapshot snapshot = await _fireStore.collection('slider').get();
return snapshot.docs;
}
@override
void initState() {
getSliderImageFromDb();
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
FutureBuilder(
initialData: [], //remove later
future: getSliderImageFromDb(),
builder: (_, snapshot) {
return snapshot.data == null
? Container()
: CarouselSlider.builder(
itemCount:
snapshot.data!.length,
itemBuilder: (context, int index, int pageIndex) {
DocumentSnapshot sliderImage =
snapshot.data[index];
Map getImage = sliderImage.data();
return Image.network(getImage['image']);
},
options: CarouselOptions());
},
)
],
);
}
}
snapshot.data.length
此处 snapShot.data 可能为 null,因此 null 安全性是 complaining.So 您通过这样的 null 检查确保它永远不会为 null
if(snapshot.data==null)
return "Something Else"
然后通过
确保其值永远不会为空的空安全性
snapshot.data!.length
您还需要指定 FutureBuilder 通用类型 假设您从数据库中获得了用户模型列表,那么它应该是
FutureBuilder<List<UserModel>>(
initialData: [],
future: getSliderImageFromDb(),
builder: (_, List<UserModel> snapshot) {
return Container();
},
);
在Flutter2中,如果它是一个可空的那么你需要处理它,
比如让我们说如果一个列表像
List<UserModel?>? users; // as this might me nullable
然后它 returns 一个可为空的 UserModel,所以如果你想将它分配给不可为空的字段,那么你需要处理
final String userName = users?.elementAtIndex(3)?.userName ?? 'N.A';
或者,如果您确定它不是空的,那么您可以
final String userName = users!.elementAtIndex(3)!.userName;
但是如果它是 null 则抛出异常。
itemCount: snapShot.data.length, 错误 - 无法无条件访问 属性 'length',因为接收者可以是 'null'。 尝试使访问有条件(使用'?.')或向目标添加空检查('!')。
DocumentSnapshot sliderImage = snapShot.data[index]; 错误 - 无法无条件调用方法“[]”,因为接收者可以是 'null'。 尝试使调用有条件(使用'?.')或向目标添加空检查('!')。
地图getImage = sliderImage.data();
错误 - 类型 'Object?' 的值无法分配给类型 'Map<dynamic, dynamic>' 的变量。 尝试更改变量的类型,或将右侧类型转换为 'Map<dynamic, dynamic>'
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
class ImageSlider extends StatefulWidget {
const ImageSlider({Key? key}) : super(key: key);
@override
_ImageSliderState createState() => _ImageSliderState();
}
class _ImageSliderState extends State<ImageSlider> {
Future getSliderImageFromDb() async {
var _fireStore = FirebaseFirestore.instance;
QuerySnapshot snapshot = await _fireStore.collection('slider').get();
return snapshot.docs;
}
@override
void initState() {
getSliderImageFromDb();
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
FutureBuilder(
initialData: [], //remove later
future: getSliderImageFromDb(),
builder: (_, snapshot) {
return snapshot.data == null
? Container()
: CarouselSlider.builder(
itemCount:
snapshot.data!.length,
itemBuilder: (context, int index, int pageIndex) {
DocumentSnapshot sliderImage =
snapshot.data[index];
Map getImage = sliderImage.data();
return Image.network(getImage['image']);
},
options: CarouselOptions());
},
)
],
);
}
}
snapshot.data.length
此处 snapShot.data 可能为 null,因此 null 安全性是 complaining.So 您通过这样的 null 检查确保它永远不会为 null
if(snapshot.data==null)
return "Something Else"
然后通过
确保其值永远不会为空的空安全性snapshot.data!.length
您还需要指定 FutureBuilder 通用类型 假设您从数据库中获得了用户模型列表,那么它应该是
FutureBuilder<List<UserModel>>(
initialData: [],
future: getSliderImageFromDb(),
builder: (_, List<UserModel> snapshot) {
return Container();
},
);
在Flutter2中,如果它是一个可空的那么你需要处理它, 比如让我们说如果一个列表像
List<UserModel?>? users; // as this might me nullable
然后它 returns 一个可为空的 UserModel,所以如果你想将它分配给不可为空的字段,那么你需要处理
final String userName = users?.elementAtIndex(3)?.userName ?? 'N.A';
或者,如果您确定它不是空的,那么您可以
final String userName = users!.elementAtIndex(3)!.userName;
但是如果它是 null 则抛出异常。