我在flutter中創建了一個應用程式,其中我的設備的所有聯系人都在flutter應用程式中被檢索到。我想選擇其中的幾個聯系人。但當我選擇任何一個聯系人時,所有的聯系人都被選中。如果有人能幫助我修改我的代碼,這將是一個很大的幫助。
源代碼:
import 'package:contacts_app/checkbox.dart'/span>。
import 'package:flutter/material.dart';
import 'package:contacts_service/contacts_ervice.dart'。
import 'package:contacters_app/smsButton.dart';
import 'package:contacters_app/phoneButton.dart'。
class ContactsPage extends StatefulWidget{
@override
_ContactsPageState createState() => _ContactsPageState();
}
class _ContactsPageState extends State< ContactsPage> {
Iterable<Contact> _contacts=[];
bool value = false。
@override
void initState() {
getContacts()。
super.initState()。
}
Future<void> getContacts() async {
//我們在進入這個頁面時已經有了聯系人的權限,所以我們。
//現在只是在檢索它。
final Iterable<Contact> contacts = await ContactsService.getContacts() 。
setState(() {
_contacts = contacts;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: _contacts != null[/span
//Build a list view of all contacts, display their avatar and.
//顯示名稱。
? ListView.builder(
itemCount: _contacts?.length ? 0。
itemBuilder: (BuildContext context, int index) {
聯系人 contact = _contacts?.elementAt(index);
return ListTile(
contentPadding:
const EdgeInsets.symmetric( vertical: 2, horizontal: 18)。)
領導:( contact.avatar != null && contact.avatar.isNotEmpty)
? CircleAvatar(
backgroundImage。MemoryImage(contact.avatar),
)
: CircleAvatar(
孩子。Text(contact.initials())。
backgroundColor: Theme.of(context).accentColor,
),
標題。Text(contact.displayName ? ? '')。
//this can be further expanded to showing contacts detail.
//> onPressed().
追蹤。行()
mainAxisSize: MainAxisSize.min,
children: <Widget>[
PhoneButton(phoneNumbers: contact.phones),
SmsButton(phoneNumbers: contact.phones),
buildCheckbox()
],
),
);
},
)
: Center(child: const CircularProgressIndicator())。
);
}
小工具 buildCheckbox()=>Checkbox(
value: 值。
onChanged: (value){
setState(() {
this.value=value。
},
);
},
);
}
uj5u.com熱心網友回復:
取一個新的串列并檢查這個串列中的索引項是否存在,如果不存在則添加它,如果這個索引項存在則洗掉它。
uj5u.com熱心網友回復: 你的 當你選擇任何聯系人時,這個布林值在你的狀態中被翻轉為 解決這個問題的一個方法是為每個聯系人維護一個布林值選擇。在代碼中,類似于:
當你加載聯系人時,你可以用布林值來填充這個串列。 然后你可以編輯 因此,當您改變復選框的值時(通過選中/取消選中),只有單個復選框的值被更新。
另外,如果您需要一次只選擇一個聯系人(更像一個單選按鈕),您可以保留一個整數,以表示當前選擇的是哪個聯系人。這更簡單,但實際上取決于您想要實作的目標。
標籤: 上一篇:在C語言中回傳2D陣列
List<String> SelectedContact=[];
List<ContactModel>state;//thats contacts list .
復選框(
value:SelectedContact.contains(state[index].phnono)。
onChanged: (bool newValue) {
if(newValue)
{
SelectedContact.add(state[index].phno)。
}
else(newValue)
{
SelectedContact.remove(state[index].phnono);
}
state[index].ischecked=newValue;
},
),
ContactsPage的狀態包含一個布林值bool value = false;。真,導致所有復選框的重建,這些復選框都使用這個相同的值。所有都被選中。List<bool> value = [] 。
Future<void> getContacts() async {
//我們在進入這個頁面時已經有了聯系人的權限,所以我們。
//現在只是在檢索它。
final Iterable<Contact> contacts = await ContactsService.getContacts() 。
setState(() {
_contacts = contacts;
//初始化booleans串列,以跟蹤哪些聯系人被選中/未被選中。
value = contacts.map((e) => false).toList()。
});
}
buildCheckbox函式來接收索引,并查看和操作這個索引的布林值:Widget buildCheckbox(int index)=>Checkbox(
value: value[index],
onChanged: (value){
setState(() {
this.value[index]=value。
},
);
},
);
