首页 > 解决方案 > 我正在制作通讯录应用程序,但是当我保存联系人时,未显示姓名

问题描述

这是我的联系人列表页面

class Contacts extends StatefulWidget with NavigationStates {
  @override
  _ContactsState createState() => _ContactsState();
}
 class _ContactsState extends State<Contacts>{
   DatabaseHelper databaseHelper = DatabaseHelper();
   List<contacts> contactsList;
   int count = 0;
   @override
  Widget build(BuildContext context, ) {
     if(contactsList == 0){
       contactsList = List<contacts>();
       updateListView();
     }
    return Scaffold(
      resizeToAvoidBottomPadding: false,
      appBar: AppBar(
        title: Text("Contacts"),
        backgroundColor: Colors.lightGreenAccent,
        centerTitle: true,
      ),
      body:  Column(
            children: <Widget>[
               Container(
                padding: EdgeInsets.all(4.0),
                margin: EdgeInsets.all(5.0),
                child: TextField(
                 //controller: searchController,
                  decoration: InputDecoration(
                    labelText:'Search Contacts',
                      border: new OutlineInputBorder(
                         borderRadius: BorderRadius.all(Radius.circular(25)),
                          borderSide: new BorderSide(
                        color: Colors.pinkAccent
                      )
                    ),
                      prefixIcon: Icon(
                       Icons.search,
                        color: Colors.black,
                      )
                  ),
                ),
              ),
             Expanded(
              child: ListView.builder(
                itemCount: count,
                itemBuilder: (context , int position){
                  return  Card(
                    elevation: 1.0,
                    shape: RoundedRectangleBorder(
                      side: BorderSide(color: Colors.pinkAccent,width: 1),
                      borderRadius: BorderRadius.circular(20)
                    ),
                    child:  Container(
                      margin: EdgeInsets.all(6.0),
                      padding: EdgeInsets.all(4.0),
                      color: Colors.white,
                      child: ListTile(
                         leading:  CircleAvatar(
                           radius: 30.0,
                           backgroundColor: Colors.lightBlueAccent,
                           child: Icon(Icons.person,color: Colors.black,),
                         ),
                        title: Text(this.contactsList[position].first_name,style: TextStyle(color: Colors.black,fontSize: 28.0),),
                        subtitle: Text(this.contactsList[position].last_name,style:TextStyle(color: Colors.black38,fontSize: 15.0),),
                        trailing: GestureDetector(
                          child: Icon(Icons.delete, color: Colors.pinkAccent,),
                          onTap: () {
                            _delete(context, contactsList[position]);
                          },
                        ),
                      ),
                    ),
                  );
                },
              ),
            )
            ],
          ),
      floatingActionButton: new FloatingActionButton(onPressed: null,
       child: new Icon(Icons.dialpad,color: Colors.black,size: 30,),
         backgroundColor: Colors.pinkAccent,
       ),
      bottomNavigationBar: CurvedNavigationBar(
        color: Colors.lightGreenAccent,
        backgroundColor: Colors.white,
        buttonBackgroundColor: Colors.pinkAccent,
        height: 50,
        index: 1,
        items:<Widget>[
          Icon(Icons.call,size: 25,color: Colors.black,),
          Icon(Icons.home,size: 30,color: Colors.black,),
          Icon(Icons.person_add_rounded,size: 25,color: Colors.black,),
        ],
        animationDuration: Duration(
            milliseconds: 400
        ),
        animationCurve: Curves.easeIn,
        onTap: (index) async {
          if (index == 0)
            Navigator.of(context).push(
                MaterialPageRoute(
                    builder: (BuildContext context) {
                      return logs();
                    }
                )
            );
          if (index == 1)
            Navigator.of(context).push(
                MaterialPageRoute(
                    builder: (BuildContext context) {
                      return Contacts();
                    }
                )
            );
          if (index == 2) 
         navigateToDetail(contacts('',''));
        }
      ),
    );
  }
  updateListView() {
     final Future<Database> dbFuture = databaseHelper.initalizeDatabase();
     dbFuture.then((database) {
       Future<List<contacts>> contactsListFuture = databaseHelper.getContactList();
       contactsListFuture.then((contactsList){
         setState(() {
           this.contactsList = contactsList;
           this.count = contactsList.length;
         });
       });
     });
  }
   Color getStorageColor() {
     int storage;
     switch (storage) {
       case 1:
         return Colors.pinkAccent;
         break;
       case 2:
         return Colors.lightBlueAccent;
         break;
         default:
         return Colors.lightBlueAccent;
     }
   }
   void navigateToDetail(contacts contact) async{
     bool result = await Navigator.push(context, MaterialPageRoute(builder: (context) {
       return AddContacts(contact);
     }));

     if (result == true) {
       updateListView();
     }
   }
   void _delete(BuildContext context, contacts contact) async {

     int result = await databaseHelper.deleteContact(contact.id);
     if (result != 0) {
       _SnackBar(context, 'Contact Deleted Successfully');
       updateListView();
     }
   }
   void _SnackBar(BuildContext context, String message) {
     final snackBar = SnackBar(
         content: Text(message),
        action: SnackBarAction(
       label: 'Undo',
          onPressed: (){},
     ),
     );
     // ignore: deprecated_member_use
     Scaffold.of(context).showSnackBar(snackBar);
   }
}

这是我的联系人详细信息页面

 import 'dart:io';
    //import 'package:contacts_service/contacts_service.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:image_picker/image_picker.dart';
    //import 'package:sqflite/sqflite.dart';
    import 'package:mycontacts_app/models/Contact.dart';
    import 'dart:async';
    import 'package:mycontacts_app/utils/database_helper.dart';
    //import 'package:intl/intl.dart';
    class AddContacts extends StatefulWidget {
       final contacts contact;
      AddContacts(this.contact);
      //AddContacts(contacts contact);
      @override
      State<StatefulWidget>  createState() {
        // _AddContactsState();
         return _AddContactsState(this.contact);
      }
    }
      class _AddContactsState extends State<AddContacts> {
       //TextEditingController _fnameController,_numberController,_lnameController;
        DatabaseHelper helper = DatabaseHelper();
        PickedFile _imageFile;
      final ImagePicker _picker = ImagePicker();
       _AddContactsState(this.contact);
    
       TextEditingController _fnameController = TextEditingController();
       TextEditingController _numberController = TextEditingController();
       TextEditingController _lnameController = TextEditingController();
    
    
      contacts contact;
      List _Storage = ['Phone','Sim'];
      //String _storageval;
      @override
      Widget build(BuildContext context) {
        //_nameController = contacts.first_name
        _fnameController.text = contact.first_name;
        _lnameController.text = contact.last_name;
        _numberController.text = contact.phone_no as String;
        return Scaffold(
          appBar: AppBar(
            title: Text("New Contact"),
            backgroundColor: Colors.lightGreenAccent,
            centerTitle: true,
          ),
          body: SingleChildScrollView(
            child: Container(
              padding: EdgeInsets.symmetric(
                vertical: 40.0,
                horizontal: 10.0,
              ),
              //margin: EdgeInsets.all(15),
              child: Form(
                child: Column(
                  //crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                     Padding(
                      padding: const EdgeInsets.all(16.0),
                      child: Container(
                        padding: EdgeInsets.only(left: 16.0,right: 16.0),
                        decoration: BoxDecoration(
                          border: Border.all(
                            color: Colors.white
                          ),
                          borderRadius: BorderRadius.circular(20.0),
                        ),
                        child: DropdownButton(
                         hint: Text('Store In '),
                          dropdownColor: Colors.black12,
                          elevation: 5,
                          icon: Icon(Icons.arrow_drop_down),
                          iconSize: 20.0,
                          isExpanded: true,
                          style: TextStyle(
                            color: Colors.black,fontSize: 18.0
                          ),
                          items: _Storage.map((value){
                            return DropdownMenuItem(
                              value: value,
                              child: Text(value),
                            );
                          }).toList(),
                          value: getStorageAsString(contact.storage),
                          onChanged: (value){
                            setState(() {
                              //_storageval = value;
                              updateStorageAsInt(value);
                            });
                          },
                        ),
                      ),
                    ),
                   imageProfile(),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                        controller: _fnameController,
                        onChanged: (value){
                          updateFirstname();
                        },
                        decoration: InputDecoration(
                          hintText: 'First Name',
                          prefixIcon: Icon(Icons.person),
                          //prefixText: "Name",
                          suffixIcon: Icon(Icons.keyboard_arrow_down),
                          fillColor: Colors.white,
                          filled: true,
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          contentPadding: EdgeInsets.all(15),
                        ),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                        controller: _lnameController,
                        onChanged: (value){
                          updateLastName();
                        },
                        decoration: InputDecoration(
                          hintText: 'Last Name',
                          prefixIcon: Icon(Icons.person),
                          //prefixText: "Name",
                          //suffixIcon: Icon(Icons.keyboard_arrow_down),
                          fillColor: Colors.white,
                          filled: true,
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          contentPadding: EdgeInsets.all(15),
                        ),
                      ),
                    ),
                   // SizedBox(height: 15),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                        controller: _numberController,
                        onChanged: (value){
                          //updateNumber();
                        },
                        decoration: InputDecoration(
                          hintText: 'Number',
                          prefixIcon: Icon(Icons.phone_android),
                          //prefixText: "Name",
                          //suffixIcon: Icon(Icons.keyboard_arrow_down),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          fillColor: Colors.white,
                          filled: true,
                          contentPadding: EdgeInsets.all(15),
                        ),
                      ),
                    ),
                    //SizedBox(height: 15),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                        //controller: _nameController,
                        decoration: InputDecoration(
                          hintText: 'Address',
                          prefixIcon: Icon(Icons.location_on_rounded),
                          //prefixText: "Name",
                          suffixIcon: Icon(Icons.keyboard_arrow_down),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          fillColor: Colors.white,
                          filled: true,
                          contentPadding: EdgeInsets.all(15),
                        ),
                      ),
                    ),
                    //SizedBox(height: 15),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                        //controller: _nameController,
                        decoration: InputDecoration(
                          hintText: 'Email',
                          prefixIcon: Icon(Icons.email),
                          //prefixText: "Name",
                          //suffixIcon: Icon(Icons.keyboard_arrow_down),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          fillColor: Colors.white,
                          filled: true,
                          contentPadding: EdgeInsets.all(15),
                        ),
                      ),
                    ),
                    //SizedBox(height: 15),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                       //controller: _nameController,
                        decoration: InputDecoration(
                          hintText: 'Website',
                          prefixIcon: Icon(Icons.language),
                          //prefixText: "Name",
                          //suffixIcon: Icon(Icons.keyboard_arrow_down),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          fillColor: Colors.white,
                          filled: true,
                          contentPadding: EdgeInsets.all(15),
                        ),
                      ),
                    ),
                    //SizedBox(height: 15),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: TextFormField(
                        //controller: _nameController,
                        decoration: InputDecoration(
                          hintText: 'Work Info',
                          prefixIcon: Icon(Icons.business),
                          //prefixText: "Name",
                          //suffixIcon: Icon(Icons.keyboard_arrow_down),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(20.0),
                          ),
                          fillColor: Colors.white,
                          filled: true,
                          contentPadding: EdgeInsets.all(15),
                        ),
                      ),
                    ),
                  /*ListView.builder(
                    itemBuilder: (context, index){
                      return ExpansionTile(
                        title: ListTile(
                          title: TextField(
                            decoration: InputDecoration(
                              hintText: "Name"
                            ),
                             style: TextStyle(
                               color: Colors.black,
                               fontSize: 15.0,
                             ),
                          ),
                        ),
                        children: <Widget>[
                          ListTile(
                            title:TextFormField(
                              decoration: InputDecoration(
                                hintText: "Name Prefix"
                              ),
                            )
                          ),
                          ListTile(
                              title:TextFormField(
                                decoration: InputDecoration(
                                    hintText: " First Name"
                                ),
                              )
                          ),
                          ListTile(
                              title:TextFormField(
                                decoration: InputDecoration(
                                    hintText: " Middle Name"
                                ),
                              )
                          ),
                          ListTile(
                              title:TextFormField(
                                decoration: InputDecoration(
                                    hintText: "Last Name"
                                ),
                              )
                          ),
                          ListTile(
                              title:TextFormField(
                                decoration: InputDecoration(
                                    hintText: "Name Suffix"
                                ),
                              )
                          )
                        ],
                      );
                    }
                  )*/
                  Padding(
                    padding: const EdgeInsets.only(top: 15.0, bottom: 15.0),
                    child: Row(
                      children: <Widget>[
                        Expanded(
                          child: RaisedButton(
                            color: Colors.lightGreenAccent,
                            textColor: Colors.black,
                            shape: RoundedRectangleBorder(
                                borderRadius: BorderRadius.circular(18.0),
                                side: BorderSide(color: Colors.pinkAccent),
                            ),
                            onPressed: () {
                              debugPrint("Save button clicked");
                              _save();
                            },
                            child: Text(
                              "Save"
                            ),
                          ),
                        ),
                        Container(width: 5.0,),
                        Expanded(
                          child: RaisedButton(
                            color: Colors.lightGreenAccent,
                            textColor: Colors.black,
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(18.0),
                              side: BorderSide(color: Colors.pinkAccent),
                            ),
                            onPressed: () {
                              _delete();
                            },
                            child: Text(
                                "Cancel"
                            ),
                          ),
                        )
                      ],
                    ),
                  )
                  ],
                ),
              ),
            ),
          ),
        );
      }
    Widget imageProfile() {
        return Center(
          child: Stack(
            children: <Widget>[
              CircleAvatar(
                radius: 50.0,
                backgroundImage: _imageFile==null? AssetImage("assets/default.png"):FileImage(File(_imageFile.path)),
              ),
              Positioned(
                bottom: 20.0,
                right: 20.0,
                child: InkWell(
                  onTap: () {
                    showModalBottomSheet(
                      context: context,
                      builder: ((builder) => bottomSheet()),
                    );
                  },
                  child: Icon(
                    Icons.camera_alt,
                    color: Colors.lightGreenAccent,
                    size: 28.0,
                  ),
                ),
              ),
            ],
          ),
        );
    }
    Widget bottomSheet() {
        return Container(
          height: 100.0,
          width: MediaQuery.of(context).size.width,
          margin: EdgeInsets.symmetric(
            horizontal: 20,
            vertical: 20,
          ),
          child: Column(
            children: <Widget>[
              Text(
                "Choose Contact Image",
                style: TextStyle(
                  fontSize: 20,
                ),
              ),
              SizedBox(
                height: 20,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                 FlatButton.icon(
                   icon: Icon(Icons.camera),
                   onPressed: (){
                     takePhoto(ImageSource.camera);
                   },
                   label: Text("Camera"),
                 ),
                  FlatButton.icon(
                    icon: Icon(Icons.image),
                    onPressed: (){
                      takePhoto(ImageSource.gallery);
                    },
                    label: Text("Gallery"),
                  )
                ],
              )
            ],
          ),
        );
    }
    void takePhoto(ImageSource source) async {
         final pickedFile = await _picker.getImage(
             source: source,
         );
         setState(() {
           _imageFile = pickedFile;
         });
    }
       void updateFirstname(){
         contact.first_name = _fnameController.text;
       }
       // Update the description of Note object
       void updateLastName() {
         contact.last_name = _lnameController.text;
       }
       /*void updateNumber() {
         contact.phone_no = _numberController.text as int;
       }*/
       void _save() async {
        moveToLastScreen();
         //n.date = DateFormat.yMMMd().format(DateTime.now());
         int result;
         if (contact.id != null) {  // Case 1: Update operation
           result = await helper.updateContact(contact);
         } else { // Case 2: Insert Operation
           result = await helper.insertContact(contact);
         }
         if (result != 0) {  // Success
           _showAlertDialog('Status', 'Contact Saved Successfully');
         } else {  // Failure
           _showAlertDialog('Status', 'Problem Saving Contact');
         }
       }
       void moveToLastScreen() {
         //Navigator.pop(context);
         Navigator.pop(context, true);
       }
       void _delete() async {
         moveToLastScreen();
         // Case 1: If user is trying to delete the NEW NOTE i.e. he has come to
         // the detail page by pressing the FAB of NoteList page.
         if (contact.id == null) {
           _showAlertDialog('Status','No Contact was deleted');
           return;
         }
         // Case 2: User is trying to delete the old note that already has a valid ID.
         int result = await helper.deleteContact(contact.id);
         if (result != 0) {
           _showAlertDialog('Status','Contact Deleted Successfully');
         } else {
           _showAlertDialog('Status', 'Error Occured while Deleting Contact');
         }
       }
        void _showAlertDialog(String title, String message) {
          AlertDialog alertDialog = AlertDialog(
            title: Text(title),
            content: Text(message),
          );
          showDialog(
              context: context,
              builder: (_) => alertDialog
          );
        }
       void updateStorageAsInt(String value) {
         switch (value) {
           case 'Phone':
             contact.storage = 1;
             break;
           case 'Sim':
             contact.storage = 2;
             break;
         }
       }
       // Convert int priority to String priority and display it to user in DropDown
       String getStorageAsString(int value) {
         String storage;
         switch (value) {
           case 1:
             storage = _Storage[0];  // 'High'
             break;
           case 2:
             storage = _Storage[1];  // 'Low'
             break;
         }
         return storage;
       }
    }

显示联系人卡片和图标,但未显示姓名。

我什至收到如下错误:- 此小部件已被卸载,因此 State 不再具有上下文(应被视为已失效)。

它甚至没有显示错误的位置或文件而且我无法解决错误。

标签: flutter

解决方案


推荐阅读