Search code examples
flutterdartcompiler-errorsdart-null-safety

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


I'm new to Flutter and I've been trying to use the package contacts_service to be able to have a list with names & numbers from your contacts. Below is the code of attempt, however "title: Text(contact.displayName)" gives me the error displayName error and "subtitle: Text(contact.phones.elementAt(0).value gives me the error elementAt error. From what I understand this is due to null safety, but I'm not quite sure where or how to check for null in my code. Do I do it inside the scaffold or before I build it? Thank you

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
                    ),
                  );
                },
              )
            ],
          ),
        ),
      );
    }
  }

Solution

  • 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}"
                    ),
                  );
                },
              )
            ],
          ),
        ),
        );
        }
      }
    

    TRY THIS