参数类型 '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。然后后面和第一种情况一样。

希望对您有所帮助。