如何在搜索用户列表视图的另一页中显示所选用户信息,生成器Flutter Firebase

fumotvh3  于 2023-05-01  发布在  Flutter
关注(0)|答案(1)|浏览(119)

我目前正试图显示用户数据,如从社交媒体后,用户搜索另一个用户。我有一个通用的搜索用户功能,可以搜索用户使用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数据放到另一个页面来显示它?还是其他选择?

2cmtqfgy

2cmtqfgy1#

1.使ProfileOthers构造函数接受要发送的数据类型的参数。在下面的示例中,数据被定义为Map并在此处设置。

class ProfileOthers extends StatelessWidget {
  const ProfileOthers({super.key, required this.data});

  final Map<String, dynamic> data;

  @override
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

1.然后,使用ListTile小部件的ontap中的Navigator将路由推送到ProfileOthers小部件。你把你想要发送的数据作为一个参数放在它的构造函数中。

Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => ProfileOthers(data: data),
    ));

通过调用适当的键(如data['email']data['name']),可以在ProfileOthers小部件上删除必要的信息

相关问题