【问题标题】:How to get matched user list show in search result [Flutter]如何在搜索结果中显示匹配的用户列表 [Flutter]
【发布时间】:2021-10-25 05:38:53
【问题描述】:

我正在使用包search_page

我想在搜索他们的名字时显示用户名,比如这个例子

这是我的 Firestore,我的用户名为 Test User OneTest User Two 这是我的 FloatingActionButton( ) 代码

FloatingActionButton(
      onPressed: () => showSearch(
        context: context,
        delegate: ChatSearch(),
      ),
      child: Icon(Icons.chat),
    ),

这是我的 ChatSearch() 代码

class ChatSearch extends SearchDelegate {

FirebaseFirestore _fires = FirebaseFirestore.instance;

Future<QuerySnapshot> getUserInfo() async {
return await _fires.collection("Students").where("displayName", isEqualTo: query).get();
}
   ...

@override
Widget buildResults(BuildContext context) {
  return Column(
  children: [
    FutureBuilder(
        future: getUserInfo(),
        builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError) {
            return Text('No user found.');
          }
          else if (snapshot.connectionState == ConnectionState.waiting) {
            return Text('Loading ...');
          }
          return ListView.builder(
            shrinkWrap: true,
            itemCount: snapshot.data.docs.length,
            itemBuilder: (BuildContext context, int index) {
              var result = snapshot.data.docs[index];
              return ListTile(
                title: Text(result["displayName"]),
                subtitle: Text(result["society"]),
                leading: CircleAvatar(backgroundImage: NetworkImage(result["photoUrl"]),),
              );
            },
          );
        }),
    ],
  );
}
}

这是我的截图

如何获取查询(所有与搜索匹配的用户名)而不是 isEqualTo? 比如我搜索Test User,会出现Test User OneTest User 2

如果有人可以帮助我或为我提供一些指导,我将不胜感激。谢谢。

【问题讨论】:

标签: firebase flutter google-cloud-firestore


【解决方案1】:

不用插件很简单,这里是代码

//it's the code to search for user for name
static Future<QuerySnapshot> getUserInfo(String name) {
Future<QuerySnapshot> users =
    usersRef.where('name', isGreaterThanOrEqualTo: name).getDocuments();
return users;
}

这是一些值

TextEditingController _searchController = TextEditingController();
Future<QuerySnapshot> _users;
String _searchText = '';

这是搜索用户界面代码

@override
Widget build(BuildContext context) {
String _currentUserId = Provider.of<UserData>(context).currentUserId;
void _clearSearch() {
  WidgetsBinding.instance
      .addPostFrameCallback((_) => _searchController.clear());
  setState(() {
    _users = null;
    _searchText = '';
  });
}

return Scaffold(
  appBar: AppBar(
    title: TextField(
      controller: _searchController,
      decoration: InputDecoration(
        focusedBorder: InputBorder.none,
        enabledBorder: InputBorder.none,
        contentPadding: const EdgeInsets.symmetric(vertical: 15.0),
        border: InputBorder.none,
        hintText: 'Search for a user...',
        prefixIcon: Icon(
          Icons.search,
          color: Theme.of(context).accentColor.withOpacity(0.6),
          size: 30.0,
        ),
        suffixIcon: _searchText.trim().isEmpty
            ? null
            : IconButton(
                color: Theme.of(context).accentColor.withOpacity(0.6),
                icon: Icon(Icons.clear),
                onPressed: _clearSearch,
              ),
        // filled: true,
      ),
      onChanged: (value) {
        setState(() {
          _searchText = value;
        });
      },
      onSubmitted: (input) {
        if (input.trim().isNotEmpty) {
          setState(() {
            _users = DatabaseService.searchUsers(input);
          });
        }
      },
    ),
  ),
  body: _users == null
      ? Center(child: Text('Search for users'))
      : FutureBuilder(
          future: _users,
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
              return Center(
                child: CircularProgressIndicator(),
              );
            }
            if (snapshot.data.documents.length == 0) {
              return Center(
                child: Text('No Users found! Please try again.'),
              );
            }
            return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (BuildContext context, int index) {
                  //User user = User.fromDoc(snapshot.data.documents[index]);
                  // Prevent current user to send messages to himself
                  return null;
                  // (widget.searchFrom != SearchFrom.homeScreen &&
                  //         user.id == _currentUserId)
                  //     ? SizedBox.shrink()
                  //     : _buildUserTile(user);
                });
          },
        ),
);
}

这是用户磁贴

ListTile _buildUserTile(User user) {
return ListTile(
  leading: CircleAvatar(
    backgroundColor: Colors.grey,
    radius: 20.0,
    backgroundImage: user.profileImageUrl.isEmpty
        ? AssetImage(placeHolderImageRef)
        : CachedNetworkImageProvider(user.profileImageUrl),
  ),
  title: Row(
    children: [Text(user.name)],
  ),
  onTap: () => Navigator.push(
            context,
            MaterialPageRoute(
              builder: (_) => ProfileScreen()
            ),
          )
);
}

希望它有效,如果缺少什么,请告诉我。

【讨论】:

  • 您好,感谢您的回答,顶部(在用户磁贴之前)对我来说很清楚,但是对于用户磁贴,我知道带有发送按钮的尾随将引导用户进入聊天屏幕,但我不能了解用户 tile 的 onTap。它是干什么用的?而createStoryScreen、homeScreen、messageScreen的区别是什么?你能进一步解释一下吗
  • 只是我分享给这个用户的应用代码,可以从聊天室和家中搜索用户。故事一是用户故事。抱歉,在我现在编辑代码以供您使用之前,我没有注意到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2021-11-03
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多