怎样利用Flutter仿写微信搜索页效果(flutter,微信开发,开发技术)

时间:2024-05-04 11:34:37 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    效果图

    怎样利用Flutter仿写微信搜索页效果

    如上图所示,我们用 Flutter 来仿写搜索页面,这里聊天首页点击搜索栏会跳转到搜索页,搜索页面包含顶部搜索框跟底部 ListView,在搜索框内我们输入搜索词会检索聊天列表模型中 name 属性中包含搜索词的模型,并在底部列表中展示,且搜索词高亮显示。下面我们分别来介绍下这些功能的实现。

    顶部搜索栏

    怎样利用Flutter仿写微信搜索页效果

    classSearchBarextendsStatefulWidget{finalValueChanged<String>?onChanged;constSearchBar({this.onChanged});@override_SearchBarStatecreateState()=>_SearchBarState();}class_SearchBarStateextendsState<SearchBar>{finalTextEditingController_editingController=TextEditingController();bool_showClose=false;void_onChange(text){if(null!=widget.onChanged){widget.onChanged!(text);}setState((){_showClose=((textasString).length>0);});}@overrideWidgetbuild(BuildContextcontext){returnContainer(height:84,color:CahtThemColor,child:Column(children:[SizedBox(height:40,),//上半部分留空Container(height:44,child:Row(children:[Container(width:screenWidth(context)-50,height:34,margin:EdgeInsets.only(left:5,right:10),padding:EdgeInsets.only(left:5,right:5),decoration:BoxDecoration(color:Colors.white,borderRadius:BorderRadius.circular(6.0),),child:Row(children:[Image(image:AssetImage('images/放大镜b.png'),width:20,color:Colors.grey,),//放大镜Expanded(child:TextField(controller:_editingController,onChanged:_onChange,autofocus:true,cursorColor:Colors.green,style:TextStyle(fontSize:16.0,color:Colors.black87,fontWeight:FontWeight.w400,),decoration:InputDecoration(contentPadding:EdgeInsets.only(left:5,right:5,bottom:12,),border:InputBorder.none,hintText:'搜索',hintStyle:TextStyle(fontSize:16.0,color:Colors.grey,fontWeight:FontWeight.w400,),),),),if(_showClose)GestureDetector(onTap:(){//清空搜索框_editingController.clear();setState((){_onChange('');});},child:Icon(Icons.cancel,color:Colors.grey,size:20,),),],mainAxisAlignment:MainAxisAlignment.spaceBetween,),),//左边白色背景GestureDetector(onTap:(){Navigator.pop(context);},child:Text('取消'),),//右边取消按钮],),),//搜索条部分],),);}}

    针对搜索页的整体布局我们可以分为顶部的搜索栏跟底部的搜索列表两部分,针对搜索栏我们单独定义了一个 SearchBar 的类来实现,底部搜索列表我们用 Expanded 部件进行了包装。

    SearchBar 实现细节

    针对 SearchBar 我们这里整体高度设置为了 84,这里最好高度定义为一个变量,根据机型来设置。针对搜索栏我们分为上下两部分,顶部留白及内容部分,顶部留白用 SizedBox 部件实现,底部内容用 Row 部件来实现,分为左边搜索框及右边取消按钮。

    左边搜索框实现

    搜索框整体部分我们用 Container 部件来实现,可以设置宽、高及圆角属性。child 属性我们也是用 Row 部件来实现,分为左边搜索图标、中间 TextField 及右边 关闭按钮。

    TextField 实现细节

    TextField 部件有两个比较重要的属性,onChangedcontrolleronChanged 我们传入了一个外部方法 _onChange,可以监听输入框文字的变化,当有文字时展示关闭按钮,没有文字时隐藏关闭按钮。controller 我们传入了一个外部定义的属性 _editingController,可以用来控制 TextField 的编辑。

    关闭按钮的实现

    关闭按钮我们根据 _showClose 来判断是否展示,且通过 GestureDetector 部件进行包装,点击的时候清空输入框及调用 _onChange 方法,参数传入空字符串,_onChange 方法中字符串为空的时候就会隐藏关闭按钮。

    右边取消按钮实现

    取消按钮点击的时候就是返回到上一个页面。

    内容的检索

    我们监听到文字输入框的变化后,就需要进行内容的检索,并且在底部列表中进行展示。

    内容的传递

    classSearchCellextendsStatelessWidget{finalList<ChatModel>?datas;constSearchCell({this.datas});}
    classSearchPageextendsStatefulWidget{finalList<ChatModel>?datas;constSearchPage({this.datas});}

    这里我们是基于聊天页面列表数据模型进行检索,找到名称中包含搜索词的模型进行展示。所以我们在 SearchCell 中定义了 datas 属性,并且在 SearchPage 中也定义了 datas 属性,分别在初始化的时候进行传递,这样我们在搜索页面就可以拿到了聊天列表的模型数据。

    内容的检索

    //满足查找条件的数据数组List<ChatModel>_models=[];//正在搜索的内容String_searchStr='';//搜索数据查找void_searchData(Stringtext){//每次搜索前先清空_models.clear();_searchStr=text;if(text.length<1){setState((){});return;}for(inti=0;i<datas.length;i++){Stringname=widget.datas?[i].nameasString;if(name.contains(text)){_models.add(widget.datas?[i]asChatModel);}}setState((){});}

    我们把检索逻辑都抽取到了 _searchData 方法中,输入内容变化的时候调用 _searchData 方法。这里我们定义了一个 _models 数组,专门存放检索数据,我们遍历 datas,把检索到的模型添加到 _models 中。

    搜索列表实现

    TextStyle_normalStyle=TextStyle(fontSize:16,color:Colors.black,);TextStyle_hightlightedStyle=TextStyle(fontSize:16,color:Colors.green,);Widget_searchTitle(Stringname){List<TextSpan>textSpans=[];List<String>searchStrs=name.split(_searchStr);for(inti=0;i<searchStrs.length;i++){Stringstr=searchStrs[i];if(str==''&&i<searchStrs.length-1){textSpans.add(TextSpan(text:_searchStr,style:_hightlightedStyle));}else{textSpans.add(TextSpan(text:str,style:_normalStyle));if(i<searchStrs.length-1){textSpans.add(TextSpan(text:_searchStr,style:_hightlightedStyle));}}}returnRichText(text:TextSpan(children:textSpans));}

    搜索列表的 cell 就是复用聊天列表的 cell,但是需要变化的是搜索内容的高亮显示,所以 ListTile 部件的 title 属性我们用 RichText 来实现,实现内容这里抽取到了 _searchTitle 方法中。name.split(_searchStr) 会返回一个根据搜索词 _searchStr 进行分割的数组,但是当字符串的开头或者结尾有跟 _searchStr 相同的字符的时候在 searchStrs 数组中的元素就是空字符串,所以我们就需要进行特别判 str == ''。我们循环遍历 searchStrs 数组来创建 TextSpan 部件,并且根据内容是否跟搜索内容一样来分别指定样式 _normalStyle 与 _hightlightedStyle。

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:怎样利用Flutter仿写微信搜索页效果的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:Linux安装php的方法是什么下一篇:

    17 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18