参数类型 'String?' 无法分配给参数类型 'String & Method can't be unconditionally invoked because to receiver can be null
The argument type 'String?' can't be assigned to the parameter type 'String & Method can't be unconditionally invoked because to receiver can be null
我是 Flutter 的新手,我一直在尝试使用包 contacts_service 来获得包含联系人姓名和电话号码的列表。
下面是尝试的代码,但是“标题:文本(contact.displayName)”给我错误displayName error and "subtitle: Text(contact.phones.elementAt(0).value gives me the error elementAt error。
据我了解,这是由于 null 安全性所致,但我不太确定在代码中的何处或如何检查 null。我是在脚手架内做还是在搭建之前做?
谢谢
import 'package:contacts_service/contacts_service.dart';
import 'package:flutter/material.dart';
class Contacts extends StatefulWidget {
@override
_Contacts createState() => _Contacts();
}
class _Contacts extends State<Contacts>{
List<Contact> contacts =[];
@override
void initState() {
super.initState();
getAllContacts();
}
getAllContacts() async{
List<Contact> _contacts = (await ContactsService.getContacts(withThumbnails: false)).toList();
setState(() {
contacts = _contacts;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Contact info'
),),
body: Container(
padding: EdgeInsets.all(20),
child: Column(
children: <Widget>[ Text ('test'),
ListView.builder(
shrinkWrap: true,
itemCount: contacts.length,
itemBuilder: (context, index) {
Contact contact = contacts[index];
return ListTile(
title: Text(contact.displayName),
subtitle: Text(
contact.phones.elementAt(0).value
),
);
},
)
],
),
),
);
}
}
import 'package:contacts_service/contacts_service.dart';
import 'package:flutter/material.dart';
class Contacts extends StatefulWidget {
@override
_Contacts createState() => _Contacts();
}
class _Contacts extends State<Contacts>{
List<Contact> contacts =[];
@override
void initState() {
super.initState();
getAllContacts();
}
getAllContacts() async{
List<Contact> _contacts = (await ContactsService.getContacts(withThumbnails:
false)).toList();
setState(() {
contacts = _contacts;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Contact info'
),),
body: Container(
padding: EdgeInsets.all(20),
child: Column(
children: <Widget>[ Text ('test'),
ListView.builder(
shrinkWrap: true,
itemCount: contacts.length,
itemBuilder: (context, index) {
return ListTile(
title: Text("${contact.displayName}"),
subtitle: Text(
"${contact.phones.elementAt(0).value}"
),
);
},
)
],
),
),
);
}
}
试试这个
首先,我希望你参考这个 documentation 关于 Contact
class。
它的属性都是nullable。所以在你自己检查之前你永远不知道它是否为空。
如果你想设置一个默认值以防它为 null,你可以对这段代码这样做。
Text(contact.displayName)
-> Text(contact.displayName??'default value')
第二个代码检查 contact.displayName
是否为 null,如果是,'default value'
的字符串文字将被 returned。您可以 return 任何其他您想要的默认值。
我们来谈谈第二个。如果您尝试调用可空对象的方法,您不妨检查它是否为空。
如果您确定它在逻辑上(不是在编程上)不能为空,您可以告诉编译器这在运行时不会为空。
contact.phones.elementAt(0).value
-> contact.phones!.elementAt(0).value
但是如果有一点点概率 contact.phones
可能为空,您将再次看到空检查错误。然后我们像第一种情况一样设置一个默认值。
contact.phones.elementAt(0).value
-> contact.phones?.elementAt(0)??defaultValue
在上面的代码中,?
在phones
之后的工作原理是, contact.phones
的方法调用将被执行仅当contact.phones
不为空时。因此,如果它为 null,则什么也不会做,最终将为 null。然后后面和第一种情况一样。
希望对您有所帮助。
我是 Flutter 的新手,我一直在尝试使用包 contacts_service 来获得包含联系人姓名和电话号码的列表。 下面是尝试的代码,但是“标题:文本(contact.displayName)”给我错误displayName error and "subtitle: Text(contact.phones.elementAt(0).value gives me the error elementAt error。 据我了解,这是由于 null 安全性所致,但我不太确定在代码中的何处或如何检查 null。我是在脚手架内做还是在搭建之前做? 谢谢
import 'package:contacts_service/contacts_service.dart';
import 'package:flutter/material.dart';
class Contacts extends StatefulWidget {
@override
_Contacts createState() => _Contacts();
}
class _Contacts extends State<Contacts>{
List<Contact> contacts =[];
@override
void initState() {
super.initState();
getAllContacts();
}
getAllContacts() async{
List<Contact> _contacts = (await ContactsService.getContacts(withThumbnails: false)).toList();
setState(() {
contacts = _contacts;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Contact info'
),),
body: Container(
padding: EdgeInsets.all(20),
child: Column(
children: <Widget>[ Text ('test'),
ListView.builder(
shrinkWrap: true,
itemCount: contacts.length,
itemBuilder: (context, index) {
Contact contact = contacts[index];
return ListTile(
title: Text(contact.displayName),
subtitle: Text(
contact.phones.elementAt(0).value
),
);
},
)
],
),
),
);
}
}
import 'package:contacts_service/contacts_service.dart';
import 'package:flutter/material.dart';
class Contacts extends StatefulWidget {
@override
_Contacts createState() => _Contacts();
}
class _Contacts extends State<Contacts>{
List<Contact> contacts =[];
@override
void initState() {
super.initState();
getAllContacts();
}
getAllContacts() async{
List<Contact> _contacts = (await ContactsService.getContacts(withThumbnails:
false)).toList();
setState(() {
contacts = _contacts;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Contact info'
),),
body: Container(
padding: EdgeInsets.all(20),
child: Column(
children: <Widget>[ Text ('test'),
ListView.builder(
shrinkWrap: true,
itemCount: contacts.length,
itemBuilder: (context, index) {
return ListTile(
title: Text("${contact.displayName}"),
subtitle: Text(
"${contact.phones.elementAt(0).value}"
),
);
},
)
],
),
),
);
}
}
试试这个
首先,我希望你参考这个 documentation 关于 Contact
class。
它的属性都是nullable。所以在你自己检查之前你永远不知道它是否为空。
如果你想设置一个默认值以防它为 null,你可以对这段代码这样做。
Text(contact.displayName)
-> Text(contact.displayName??'default value')
第二个代码检查 contact.displayName
是否为 null,如果是,'default value'
的字符串文字将被 returned。您可以 return 任何其他您想要的默认值。
我们来谈谈第二个。如果您尝试调用可空对象的方法,您不妨检查它是否为空。
如果您确定它在逻辑上(不是在编程上)不能为空,您可以告诉编译器这在运行时不会为空。
contact.phones.elementAt(0).value
-> contact.phones!.elementAt(0).value
但是如果有一点点概率 contact.phones
可能为空,您将再次看到空检查错误。然后我们像第一种情况一样设置一个默认值。
contact.phones.elementAt(0).value
-> contact.phones?.elementAt(0)??defaultValue
在上面的代码中,?
在phones
之后的工作原理是, contact.phones
的方法调用将被执行仅当contact.phones
不为空时。因此,如果它为 null,则什么也不会做,最终将为 null。然后后面和第一种情况一样。
希望对您有所帮助。