【问题标题】: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参数类型“字符串?”不能分配给参数类型'字符串和方法不能无条件调用,因为接收者可以为空
【发布时间】:2022-01-14 02:56:15
【问题描述】:

我是 Flutter 的新手,我一直在尝试使用包 contacts_service 来获得包含联系人姓名和号码的列表。 下面是尝试的代码,但是“标题:文本(contact.displayName)”给了我错误displayName error,而“字幕:文本(contact.phones.elementAt(0).value 给了我错误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
                    ),
                  );
                },
              )
            ],
          ),
        ),
      );
    }
  }

【问题讨论】:

  • 像 Text("${contact.displayName}");我会工作:-)

标签: flutter dart compiler-errors dart-null-safety


【解决方案1】:
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}"
                ),
              );
            },
          )
        ],
      ),
    ),
    );
    }
  }

试试这个

【讨论】:

  • 谢谢!它解决了 displayName null 问题,但仍然存在 @CrimsonFoot 帮助我解决的 elementAt 错误。谢谢你们!
【解决方案2】:

首先,我希望你参考这个documentation 关于Contact 类。

它的属性都是可为空的。因此,在您自己检查之前,您永远不会知道它是否为空。

如果你想设置一个默认值以防它为空,你可以对这段代码这样做。

Text(contact.displayName) -> Text(contact.displayName??'default value')
第二个代码检查contact.displayName 是否为空,如果是,则返回字符串字面量'default value'。您可以返回任何其他您想要的默认值。

让我们谈谈第二个。如果你尝试调用一个可空对象的方法,你不妨检查一下它是否为空。

如果您确定它在逻辑上不能为空(不是以编程方式),您可以告诉编译器这在运行时不会为空。

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。之后就和第一种情况一样。

我希望这会有所帮助。

【讨论】:

  • 谢谢!这真的很有帮助,我设法解决了您评论中的 elementAt 问题!
  • @DipaJS 我很高兴它有帮助!
猜你喜欢
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2021-10-13
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多