我目前正试图显示用户数据,如从社交媒体后,用户搜索另一个用户。我有一个通用的搜索用户功能,可以搜索用户使用firebase像下面这样
String name = '';
List<Map<String, dynamic>> data = [];
addDataaUser() async {
for (var element in data) {
FirebaseFirestore.instance.collection('users').add(element);
}
print('Add User Data');
}
@override
void initState() {
super.initState();
addDataaUser();
}
AppBar buildSearchField() {
return AppBar(
title: Card(
child: TextField(
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
),
onChanged: ((val) {
setState(() {
name = val;
});
}),
),
),
);
}
这是用于显示用户列表的ListView构建器和ListTile。onTap函数会导致另一个页面ProfileOthers(),在那里我需要所选数据中变量的Map。
//Scaffold
Scaffold(
appBar: buildSearchField(),
body: StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('users').snapshots(),
builder: (context, snapshot) {
return (snapshot.connectionState == ConnectionState.waiting)
? Center(
child: CircularProgressIndicator(),
)
: ListView.builder(
itemCount: snapshot.data!.docs.length,
itemBuilder: (context, index) {
var data = snapshot.data!.docs[index].data()
as Map<String, dynamic>;
if (data['name']
.toString()
.toLowerCase()
.startsWith(name.toLowerCase())) {
return ListTile(
title: Text(
data['name'],
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontWeight: FontWeight.bold),
),
subtitle: Text(
data['email'],
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.black,
fontSize: 16,
fontWeight: FontWeight.bold),
),
leading: CircleAvatar(
backgroundImage: NetworkImage(data['userImage']),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ProfileOthers(data:data)),
);
},
);
}
return Container();
});
},
),
);//End of Scaffold
这是使用statefullwidget的OthersProfile页面
class ProfileOthers extends StatefulWidget {
const ProfileOthers({super.key, required this.data});
final Map<String, dynamic> data;
// final String dataname;
// final String dataemail;
// final String dataimage;
// const ProfileOthers(
// {super.key,
// required this.dataname,
// required this.dataemail,
// required this.dataimage});
@override
State<ProfileOthers> createState() => _ProfileOthersState();
}
并且在用户点击其中一个数据之后,它应该像这样显示所选择的用户数据
正如你所看到的,我不知道如何通过[index]从ListTile获取所选快照文档。
有谁知道我如何把选中的Map数据放到另一个页面来显示它?还是其他选择?
1条答案
按热度按时间2cmtqfgy1#
1.使ProfileOthers构造函数接受要发送的数据类型的参数。在下面的示例中,数据被定义为Map并在此处设置。
1.然后,使用ListTile小部件的ontap中的Navigator将路由推送到ProfileOthers小部件。你把你想要发送的数据作为一个参数放在它的构造函数中。
通过调用适当的键(如
data['email']
、data['name']
),可以在ProfileOthers小部件上删除必要的信息