首页 > 解决方案 > 搜索用户不在 Flutter 中工作,如何解决?

问题描述

我正在创建一个社交媒体应用程序颤动,因为我正在尝试向我的 Flutter 应用程序添加搜索功能,代码中一切正常,没有显示错误,但是当我在搜索应用程序屏幕上搜索 ProfileName 时,构建后没有显示结果APK。

我附上了 search.dart 和 user.dart 文件的代码。请帮帮我,我被困在这里......

搜索.dart

    import 'package:Gupshup/models/user.dart';
    import 'package:Gupshup/pages/HomePage.dart';
    import 'package:Gupshup/widgets/ProgressWidget.dart';
    import 'package:cached_network_image/cached_network_image.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:flutter/material.dart';

    class SearchPage extends StatefulWidget {
    @override
    _SearchPageState createState() => _SearchPageState();}

    class _SearchPageState extends State<SearchPage>
    with AutomaticKeepAliveClientMixin<SearchPage> {
    TextEditingController searchTextEditingController = 
    TextEditingController();
    Future<QuerySnapshot> futureSearchResults;

     emptyTheTextFormField() {
      searchTextEditingController.clear();}


    
    controlSearching(String str) {
      Future<QuerySnapshot> allUsers = usersReference
        .where("profileName", isGreaterThanOrEqualTo: str)
        .getDocuments();
    setState(() {
      futureSearchResults = allUsers;
    });
  }


    AppBar searchPageHeader() {
    return AppBar(
      backgroundColor: Colors.black,
      title: TextFormField(
        style: TextStyle(fontSize: 18.0, color: Colors.white),
        controller: searchTextEditingController,
        decoration: InputDecoration(
          hintText: "Search here....",
          hintStyle: TextStyle(color: Colors.grey),
          enabledBorder: UnderlineInputBorder(
            borderSide: BorderSide(color: Colors.grey),
          ),
          focusedBorder:
              UnderlineInputBorder(borderSide: BorderSide(color: Colors.white)),
          filled: true,
          prefixIcon: Icon(
            Icons.person_pin,
            color: Colors.white,
            size: 30.0,
          ),
          suffixIcon: IconButton(
            icon: Icon(Icons.clear),
            onPressed: emptyTheTextFormField,
          ),
        ),
        onFieldSubmitted: controlSearching,
      ),
    );
  }

        Container displayNoSearchResultScreen() {
        final Orientation orientation = MediaQuery.of(context).orientation;
         return Container(
           child: Center(
           child: ListView(
          shrinkWrap: true,
          children: <Widget>[
            Icon(
              Icons.group,
              color: Colors.grey,
              size: 200.0,
            ),
            Text(
              "Search Users",
              textAlign: TextAlign.center,
              style: TextStyle(
                  color: Colors.white,
                  fontWeight: FontWeight.w500,
                  fontSize: 65.0),
            ),
          ],
        ),
      ),
    );
  }

      displayUsersFoundScreen() {
       FutureBuilder(
        future: futureSearchResults,
         builder: (context, dataSnapshot) {  
         if (!dataSnapshot.hasData) {
          return circularProgress();
        }

        List<UserResult> searchUsersResult = [];
        dataSnapshot.data.documents.forEach((document) {
          User eachUser = User.fromDocument(document);
          UserResult userResult = UserResult(eachUser);
          searchUsersResult.add(userResult);
        });

        return ListView(children: searchUsersResult);
      },
    );
  }

  bool get wantKeepAlive => true;

     @override
     Widget build(BuildContext context) {
       return Scaffold(
        backgroundColor: Colors.black,
        appBar: searchPageHeader(),
        body: futureSearchResults == null
          ? displayNoSearchResultScreen()
          : displayUsersFoundScreen(),
    );
  }
}

    class UserResult extends StatelessWidget {
      final User eachUser;
     UserResult(this.eachUser);
     @override
     Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(3.0),
      child: Container(
        color: Colors.white54,
        child: Column(
          children: <Widget>[
            GestureDetector(
              onTap: () => print("tapped"),
              child: ListTile(
                leading: CircleAvatar(
                  backgroundColor: Colors.black,
                  backgroundImage: CachedNetworkImageProvider(eachUser.url),
                ),
                title: Text(
                  eachUser.profileName,
                  style: TextStyle(
                    color: Colors.black,
                    fontSize: 16.0,
                    fontWeight: FontWeight.bold,
                  ),
                ),
                subtitle: Text(
                  eachUser.username,
                  style: TextStyle(
                    color: Colors.black,
                    fontSize: 13.0,
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}


**User.dart**

        import 'package:cloud_firestore/cloud_firestore.dart';
        class User {
          final String id;
          final String profileName;
          final String username;
          final String url;
          final String email;
          final String bio;

       User({
         this.id,
         this.profileName,
         this.username,
         this.url,
         this.email,
         this.bio,
         });

       factory User.fromDocument(DocumentSnapshot doc) {
          return User(
          id: doc.documentID,
          email: doc['email'],
          username: doc['username'],
          url: doc['url'],
          profileName: doc['profileName'],
          bio: doc['bio'],
       );
     }
   }

你能帮我解决这个问题吗?

标签: androidfirebasefluttergoogle-cloud-firestore

解决方案


所以你关注了编码咖啡馆的系列?我会给我的代码

SearchPage.dart

import 'package:buddiesgram/models/user.dart';
import 'package:buddiesgram/pages/HomePage.dart';
import 'package:buddiesgram/pages/ProfilePage.dart';
import 'package:buddiesgram/widgets/ProgressWidget.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
import 'package:collection/collection.dart';

class SearchPage extends StatefulWidget {
  @override
  _SearchPageState createState() => _SearchPageState();
}

class _SearchPageState extends State<SearchPage> with AutomaticKeepAliveClientMixin<SearchPage>{
TextEditingController searchEditingCOntroller=TextEditingController();
Future<QuerySnapshot> futureSearchResults;

emptySearch(){
  searchEditingCOntroller.clear();
}
controlSearch(String i){
  Future<QuerySnapshot> allUsers=usersReference.where("username",isGreaterThanOrEqualTo: i).getDocuments();
  setState(() {

    futureSearchResults=allUsers;
  });
}


  AppBar searchPageHeader(){
return AppBar(
  backgroundColor: Colors.blueAccent,
  title: TextFormField(
    controller: searchEditingCOntroller,

    style: TextStyle(

      fontSize: 18.0,
      color: Colors.white,

    ),
    decoration: InputDecoration(
hintText: "Search by Name",
      hintStyle: TextStyle(color: Colors.white70),
      enabledBorder: UnderlineInputBorder(
        borderSide: BorderSide(color: Color(0xffFD9A28)),

      ),
      focusedBorder: UnderlineInputBorder(
          borderSide: BorderSide(color: Color(0xffFD9A28)),

      ),
    filled: true,
    prefixIcon: Icon(Icons.person_pin,color: Colors.white),
    suffixIcon: IconButton(icon: Icon(Icons.clear,color: Colors.white),onPressed: emptySearch),


    ),
onFieldSubmitted: controlSearch,

  ),
);
}
Container noResults(){

  // final Orientation orientation=MediaQuery.of(context).orientation;

  return Container(
child: Center(
  child: ListView(
    shrinkWrap: true,
    children: <Widget>[
Icon(Icons.group,color: Colors.grey,size: 150.0,),
Text(
"Search Users",textAlign: TextAlign.center,
  style: TextStyle(color: Colors.black ,fontWeight: FontWeight.w500,fontSize: 50.0),
),

    ],
  ),
),
);


}

showUsers(){
  return FutureBuilder(
    future: futureSearchResults,
    builder: (context,dataSnapshot){
if(!dataSnapshot.hasData){
  return circularProgress();
}

List<UserResult> searchUserResut=[];
dataSnapshot.data.documents.forEach((document){
User eachUser=User.fromDocument(document);
UserResult userResult=UserResult(eachUser);
searchUserResut.add(userResult);
});
return ListView(children: searchUserResut,);
    },
  );
}



bool get wantKeepAlive=>true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // backgroundColor: Colors.black,
      appBar: searchPageHeader(),
      body: futureSearchResults==null ? noResults() : showUsers(),
    );
  }
}

class UserResult extends StatelessWidget {
  final User eachUser;
  UserResult(this.eachUser);
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(3.0),
      child: Container(
        color: Colors.white54,
        child: Column(
          children: <Widget>[
            GestureDetector(
              onTap: ()=>displayUserProfile(context,userProfileId:eachUser.id),
              child: ListTile(

                leading: CircleAvatar(
                  backgroundColor: Colors.white54,
                  backgroundImage: new CachedNetworkImageProvider(
                      eachUser.url,
                  ),

                ),

                title: Text(eachUser.username,style: TextStyle(
                  color: Colors.black,fontSize:16.0,
                  fontWeight: FontWeight.bold,
                ),

                ),
                subtitle: Text(
                  eachUser.profileName,style: TextStyle(
                  color: Colors.black,fontSize: 13.0,
                ),
                ),

              ),
            ),
          ],
        ),
      ),
    );
  }

  displayUserProfile(BuildContext context, {String userProfileId}) {


    Navigator.push(context, MaterialPageRoute(builder: (context)=>ProfilePage(userProfileId: userProfileId,)));
  }
}

推荐阅读