List<User> allusers = [];
List<User> selectedUsers = [];
List<User> selectableUsers = allusers - selectedUsers
有誰可以幫助我如何在此處獲取 selectableUsers 串列?我試圖從所有用戶中減去選定用戶,以便搜索功能消除選定用戶?
我想根據選擇過濾用戶。
用于獲取和搜索用戶的視圖。問題是選定的用戶再次進入搜索。預期行為是“選定”用戶不應出現在“可選”用戶串列中。
class SearchGroup extends StatefulWidget {
const SearchGroup({Key? key}) : super(key: key);
@override
State<SearchGroup> createState() => _SearchGroupState();
}
class _SearchGroupState extends State<SearchGroup> {
final TextEditingController _searchController = TextEditingController();
List<User> _users = [];
List<User> _selectedUsers = [];
List<User> _selectableUsers = [];
@override
void initState() {
super.initState();
var setAllUsers = Set.from(_users);
var setSelectedUsers = Set.from(_selectedUsers);
_selectableUsers
.addAll(List.from(setAllUsers.difference(setSelectedUsers)));
}
_clearSearch() {
WidgetsBinding.instance
.addPostFrameCallback((_) => _searchController.clear());
setState(() => _selectableUsers = []);
}
@override
void dispose() {
super.dispose();
_searchController.dispose();
}
@override
Widget build(BuildContext context) {
final currentUserUid =
Provider.of<UserProvider>(context).getUser?.uid ?? '';
return Scaffold(
appBar: AppBar(
title: TextField(
controller: _searchController,
hintText: 'Search & select users by fullname',
suffixIcon: _selectableUsers.isEmpty
? Icon(Icons.search,
size: 20.0, color: Color.fromARGB(255, 235, 228, 228))
: IconButton(
iconSize: 15,
icon: Icon(CupertinoIcons.clear_circled_solid),
onPressed: _clearSearch,
color: Color.fromARGB(255, 235, 228, 228)),
),
onSubmitted: (input) async {
if (input.trim().isNotEmpty) {
List<User> users =
await Provider.of<DatabaseService>(context, listen: false)
.searchUsers(currentUserUid, input);
_selectedUsers.forEach((user) => users.remove(user));
_selectableUsers.forEach((user) => users.remove(user));
setState(() {
_selectableUsers = users;
});
}
}),
body: Column(
children: [
Padding(
padding: const EdgeInsets.only(left: 5.0),
child: Container(
width: double.infinity,
height: 100,
child: ListView.builder(
itemCount: _selectedUsers.length,
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index) {
User selectedUser = _selectedUsers[index];
return Container(
margin: EdgeInsets.all(10),
width: 60,
height: 60,
decoration: BoxDecoration(shape: BoxShape.circle),
child: GestureDetector(
onTap: () {
_selectedUsers.remove(selectedUser);
_selectableUsers.insert(0, selectedUser);
setState(() {});
},
child: Stack(
alignment: AlignmentDirectional.bottomEnd,
children: [
CircleAvatar(
radius: 60,
child: CachedNetworkImage(
imageUrl: selectedUser.profileImageUrl,
imageBuilder: (context, imageProvider) =>
Container(
height: 60,
width: 60,
decoration: BoxDecoration(
borderRadius:
BorderRadius.all(Radius.circular(100)),
image: DecorationImage(
image: imageProvider,
fit: BoxFit.cover,
),
),
),
),
),
Positioned(
top: 3,
child: Icon(
Icons.remove_circle,
size: 20,
color: Colors.red,
),
),
],
),
),
);
}),
),
),
Expanded(
child: ListView.separated(
separatorBuilder: (BuildContext context, int index) {
return const Divider(thickness: 1.0);
},
itemCount: _selectedUsers.length _selectableUsers.length,
itemBuilder: (BuildContext context, int index) {
if (index < _selectedUsers.length) {
User selectedUser = _selectedUsers[index];
return ListTile(
leading: CircleAvatar(
radius: 28,
child: CachedNetworkImage(
imageUrl: selectedUser.profileImageUrl,
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(30)),
image: DecorationImage(
image: imageProvider, fit: BoxFit.cover),
),
),
),
),
title: Text(
selectedUser.fullname,
style: TextStyle(fontSize: 14),
),
trailing: Icon(Icons.check_circle, color: blueColor),
onTap: () {
_selectedUsers.remove(selectedUser);
_selectableUsers.insert(0, selectedUser);
setState(() {});
},
);
} else {
int userIndex = index - _selectedUsers.length;
User user = _selectableUsers[userIndex];
return ListTile(
leading: CircleAvatar(
radius: 28,
child: CachedNetworkImage(
imageUrl: user.profileImageUrl,
imageBuilder: (context, imageProvider) => Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(50)),
image: DecorationImage(
image: imageProvider, fit: BoxFit.cover),
),
),
),
),
title: Text(
user.fullname,
style: TextStyle(fontSize: 14),
),
trailing: Icon(
CupertinoIcons.circle,
color: Colors.grey,
),
onTap: () {
_selectedUsers.add(user);
_selectableUsers.remove(user);
setState(() {});
},
);
}
},
),
),
],
),
);
}
}
uj5u.com熱心網友回復:
嘗試這個:
onSubmitted: (input) async {
if (input.trim().isNotEmpty) {
List<User> users = await Provider.of<DatabaseService>(context, listen: false).searchUsers(currentUserUid, input);
var setAllUsers = Set.from(users);
var setSelectedUsers = Set.from(selectedUsers);
setState(() {
selectableUsers.addAll(List.from(setAllUsers.difference(setSelectedUsers)));
});
}
}),
您還需要將Equatable包添加到您的用戶模型類,假設這是您的模型類:
class User extends Equatable {// <-- add this
final String fullName;
final String avatar;
final int phone;
const User({
required this.fullName,
required this.avatar,
required this.phone,
});
@override
List<Object?> get props => [fullName, avatar, phone];// <-- add this
}
uj5u.com熱心網友回復:
一種基本的做法是檢查每個專案,例如
List<User> allusers = [];
List<User> selectedUsers = [];
List<User> selectableUsers = [];
for (final user in allusers) {
if (!selectableUsers.contains(user)) selectableUsers.add(user);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523389.html
標籤:扑镖
下一篇:使用日期選擇器顫動時對話框未更新
