在 Flutter 中按下按钮时将新小部件作为列表插入

问题描述

我正在制作一个这样的屏幕,它可以从电话簿中选择联系人并将姓名作为列表插入到我的应用程序中。我想要的是,当我按下 Add caregiver(+) 按钮时,它应该选择一个联系人并显示姓名。 我为 MOM 部分制作了一个小部件,但每当我单击按钮时,它都会将 MOM 重写为我从电话簿中选择的任何联系人。

我制作了这个屏幕:

enter image description here

我也想和妈妈一样添加爸爸和姐姐的联系方式,但是我做不到

enter image description here

这是我的屏幕代码

import 'package:epicare/NavigBar.dart';
import 'package:Flutter/cupertino.dart';
import 'package:Flutter/material.dart';
import 'package:Flutter_switch/Flutter_switch.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:contact_picker/contact_picker.dart';

//Check contacts permission
Future<PermissionStatus> _getPermission() async {

  final PermissionStatus permission = await Permission.contacts.status;
  if (permission != PermissionStatus.granted &&
      permission != PermissionStatus.denied) {
    final Map<Permission,PermissionStatus> permissionStatus =
    await [Permission.contacts].request();
    return permissionStatus[Permission.contacts] ??
        PermissionStatus.undetermined;
  } else {
    return permission;
  }
}


class CaregiverScreen extends StatefulWidget {
  @override
  _CaregiverScreenState createState() => _CaregiverScreenState();
}

class _CaregiverScreenState extends State<CaregiverScreen> {
  final ContactPicker _contactPicker = new ContactPicker();
  Contact _contact;

  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  bool isSwitched = true;
  @override
  Widget build(BuildContext context) {
    //Size size = MediaQuery.of(context).size;
    return Scaffold(
      key: _scaffoldKey,backgroundColor: Colors.white,appBar: AppBar(
        backgroundColor: const Color(0xffE5E0A1),elevation: 0,centerTitle: true,title: Text(
          "Add Caregiver",style: TextStyle(
            fontSize: 15.0,color: Colors.black,fontFamily: 'Montserrat',fontWeight: FontWeight.normal,),leading: IconButton(
          icon: Icon(
            Icons.arrow_back,onpressed: () {
            Navigator.push(
              context,MaterialPageRoute(
                builder: (context) {
                  return Homepage();
                },);
          },body: SingleChildScrollView(
        child: Container(
          padding: EdgeInsets.symmetric(horizontal: 10,vertical: 40),child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,children: [
              Row(
                children: [
                  MaterialButton(
                    onpressed: () async {

                      final PermissionStatus permissionStatus = await _getPermission();
                      if (permissionStatus == PermissionStatus.granted) {
                        //We can Now access our contacts here
                        // var contactNumber = openContactBook();
                        Contact contact = await _contactPicker.selectContact();
                        setState(() {
                          _contact = contact;
                        });
                      }
                      else {
                        //If permissions have been denied show standard cupertino alert dialog
                        showDialog(
                            context: context,builder: (BuildContext context) => CupertinoAlertDialog(
                              title: Text('Permissions error'),content: Text('Please enable contacts access '
                                  'permission in system settings'),actions: <Widget>[
                                CupertinoDialogAction(
                                  child: Text('OK'),onpressed: () => Navigator.of(context).pop(),)
                              ],));
                      }
                    },color: const Color(0xffd4d411),textColor: Colors.white,child: Icon(
                      Icons.add,size: 32,padding: EdgeInsets.all(3),shape: CircleBorder(),Text(
                    'Add a Caregiver',style: TextStyle(
                        fontFamily: 'Montserrat',fontSize: 13,color: const Color(0xff000000),height: 1.5384615384615385,fontWeight: FontWeight.w600),textHeightBehavior:
                        TextHeightBehavior(applyHeightToFirstAscent: false),textAlign: TextAlign.left,)
                ],_contact == null ? Container() : CaregiversList(_contact.fullName),],);
  }
Widget CaregiversList(String name){
    print(name);
    var c = name.split(' ');
    print(c[0]);
    var caregiver = c[0];
    var output = getinitials(string: caregiver,limitTo: 1);
    print(output);
    // var i = caregiver.codeUnitAt(0);
    // print(i);
    return Container(
    padding: EdgeInsets.symmetric(vertical: 20,horizontal: 27),child: Row(
      //crossAxisAlignment: CrossAxisAlignment.center,//mainAxisAlignment: MainAxisAlignment.spaceBetween,children: <Widget>[
        CircleAvatar(
          radius: 24,backgroundColor: const Color(0xffd4d411),child: CircleAvatar(
            radius: 22,child: Text(
              output,style: TextStyle(
                fontFamily: 'Segoe UI',fontSize: 20,SizedBox(width: 19),Column(
          crossAxisAlignment: CrossAxisAlignment.start,children: [
            Text(
              caregiver,style: TextStyle(
                  fontFamily: 'Montserrat',textHeightBehavior: TextHeightBehavior(
                  applyHeightToFirstAscent: false),isSwitched
                ? Text(
                    "Activated",fontSize: 10,color: const Color(0x80232425),fontWeight: FontWeight.w500),)
                : Text(
                    "disabled",SizedBox(width: 143),FlutterSwitch(
          width: 40.0,height: 20.0,value: isSwitched,toggleSize: 15,borderRadius: 40.0,padding: 2.0,showOnOff: false,activeColor: const Color(0xffd4d411),activetoggleColor: Colors.white,inactiveColor: const Color(0xffDDDBAF),inactivetoggleColor: Colors.white,onToggle: (value) {
            setState(() {
              isSwitched = value;
              print(isSwitched);
            });
          },);

}
  String getinitials({String string,int limitTo}) {
    var buffer = StringBuffer();
    var split = string.split(' ');
    for (var i = 0 ; i < (limitTo ?? split.length); i ++) {
      buffer.write(split[i][0]);
    }
    return buffer.toString();
  }
}

请帮助我,因为我是 Flutter 的新手。 提前谢谢你:)

解决方法

您需要管理从联系人中选择的 Caregiverlist。例如

class Caregiver {
  String name;
  bool isActive;
  
  Caregiver({this.name,this.isActive});
  
  factory Caregiver.fromJson(Map<String,dynamic> map) {
    if (map == null) return null;
    return Caregiver(name: map['name'] ?? "",isActive: map['isActive']);
  }
}
  • 初始化看护人名单

    List<Caregiver> _careList = [];
    
  • 添加看护人

    Contact contact = await _contactPicker.selectContact();
    setState(() {
      _careList.add(Caregiver(name: contact,isActive: true));
    });
    
  • show Caregiver list(要在 Scrollview 中显示 ListView,添加以下 3 行。

    ListView.separated(
     physics: NeverScrollableScrollPhysics(),shrinkWrap: true,primary: false,itemBuilder: (context,index) {        
      return _caregiverWidget(index);
    },separatorBuilder: (_,__) => Divider(),itemCount: _careList.length);
    
  • 添加新功能

    Widget _caregiverWidget(int index) {
      Caregiver _caregiver = _careList[index];
      print(_caregiver.name);
      var c = _caregiver.name.split(' ');
      print(c[0]);
      var caregiver = c[0];
      var output = getInitials(string: caregiver,limitTo: 1);
      print(output);
      // var i = caregiver.codeUnitAt(0);
      // print(i);
      return Container(
        padding: EdgeInsets.symmetric(vertical: 20,horizontal: 27),child: Row(
          //crossAxisAlignment: CrossAxisAlignment.center,//mainAxisAlignment: MainAxisAlignment.spaceBetween,children: <Widget>[
            CircleAvatar(
              radius: 24,backgroundColor: const Color(0xffd4d411),child: CircleAvatar(
                radius: 22,backgroundColor: Colors.white,child: Text(
                  output,style: TextStyle(
                    fontFamily: 'Segoe UI',fontSize: 20,color: const Color(0xff000000),),SizedBox(width: 19),Column(
              crossAxisAlignment: CrossAxisAlignment.start,children: [
                Text(
                  caregiver,style: TextStyle(
                      fontFamily: 'Montserrat',fontSize: 13,height: 1.5384615384615385,fontWeight: FontWeight.w600),textHeightBehavior:
                      TextHeightBehavior(applyHeightToFirstAscent: false),textAlign: TextAlign.left,_caregiver.isActive
                    ? Text(
                        "Activated",style: TextStyle(
                            fontFamily: 'Montserrat',fontSize: 10,color: const Color(0x80232425),fontWeight: FontWeight.w500),)
                    : Text(
                        "Disabled",],SizedBox(width: 143),FlutterSwitch(
              width: 40.0,height: 20.0,value: _caregiver.isActive,toggleSize: 15,borderRadius: 40.0,padding: 2.0,showOnOff: false,activeColor: const Color(0xffd4d411),activeToggleColor: Colors.white,inactiveColor: const Color(0xffDDDBAF),inactiveToggleColor: Colors.white,onToggle: (value) {
                setState(() {
                  _caregiver.isActive = value;
                  _careList.removeAt(index);
                  _careList.insert(index,_caregiver);
                });
              },);
    }