0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Flutter 组件: Autocomplete 自动填充 | 开发者说·DTalk

谷歌开发者 来源:未知 2022-11-10 11:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文原作者: 张风捷特烈,原文发布于: 编程之王


简单来说,Autocomplete 意为自动填充。其作用就是在输入时,进行关键字联想。在输入框下方展示列表,如下所示: 注意,这是目前 Flutter 框架内部的组件,非三方组件。目前已收录入 FlutterUnit,下面效果的源码详见之,大家可以更新查看体验:

FlutterUnit 中

输入时联想效果

下面是动态搜索的效果展示:



Autocomplete 组件最简代码


我们先一步步来了解 Autocomplete 组件,先实现如下的最简代码:

使用 Autocomplete 时,必须提供的是 optionsBuilder 参数,另外可以通过 onSelected 回调来监听选中的条目。


Autocomplete(
optionsBuilder:buildOptions,
onSelected:onSelected,
)

optionsBuilder 是一个 AutocompleteOptionsBuilder 类型的函数,从下面的定义中可以发现,该函数会回调 TextEditingValue 对象,且返回 FutureOr>。这说明这个函数是一个异步函数,我们可以在此进行网络请求,数据库查询等工作,来返回一个 Iterable 的可迭代对象。


用脚指头想一下也知道,这个可迭代对象,就决定着输入框下面的联想词是哪些。
finalAutocompleteOptionsBuilderoptionsBuilder;


typedefAutocompleteOptionsBuilder=
FutureOr>Function(TextEditingValuetextEditingValue);

比如下面通过 searchByArgs 模拟网络请求,通过 args 参数搜索数据:
FutureString>> searchByArgs(String args) async{
//模拟网络请求
awaitFuture.delayed(constDuration(milliseconds:200));
constList<String>data=[
'toly','toly49','toly42','toly56',
'card','ls','alex','fansha',
];
returndata.where((Stringname)=>name.contains(args));
}


这样,buildOptions 的逻辑如下,这就完成了输入--> 搜索 --> 展示联想词的流程。这也是 Autocomplete 组件最简单的使用。

FutureString>> buildOptions( TextEditingValue textEditingValue ) async {
if(textEditingValue.text==''){
returnconstIterable<String>.empty();
}
returnsearchByArgs(textEditingValue.text);
}



自定义 Autocomplete 组件内容


其实上面那样的默认样式很丑,而且没有提供直接的属性设置样式。所以了解如何自定义是非常关键的,否则只是一个玩具罢了。如下,我们先来实现搜索高亮显示的自定义,其中也包括对输入框的自定义。


Autocomplete 中提供了 fieldViewBuilderoptionsViewBuilder 分别用于构造输入框浮层面板

如下,代码中通过 _buildOptionsView_buildFieldView 进行相应组件构造:
Autocomplete(
optionsBuilder:buildOptions,
onSelected:onSelected,
optionsViewBuilder:_buildOptionsView,
fieldViewBuilder:_buildFieldView,
);


如下是 _buildOptionsView 方法的实现,其中会回调 onSelected 回调函数,和 options 数据,我们需要做的就是依靠数据,构建组件进行展示即可。另外,默认浮层面板和输入框底部平齐,可以通过 Padding 进行下移。另外,由于是浮层,展示文字时,上面需要嵌套 Material 组件。

至于高亮某个关键字,下面是我封装的一个小方法,拿来即用:
---->[高亮某些文字]----
finalTextStylelightTextStyle=constTextStyle(
color:Colors.blue,
fontWeight:FontWeight.bold,
);
InlineSpanformSpan(Stringsrc,Stringpattern){
Listspan=[];
Listparts=src.split(pattern);
if(parts.length>1){
for(inti=0;i< parts.length; i++) {
span.add(TextSpan(text:parts[i]));
if(i!=parts.length-1){
span.add(TextSpan(text:pattern,style:lightTextStyle));
}
}
}else{
span.add(TextSpan(text:src));
}
returnTextSpan(children:span);
}


另外,对于输入框的构建,通过如下的 _buildFieldView 实现,其中有 _controller 记录一下 TextEditingController,是因为 optionsViewBuilder 回调中并没有回调输入的 arg 字符,所以想要输入的关键字高亮,只能出此下策。这样,在 TextFormField 构建时,您可以指定自己需要的装饰。

到此,我们就实现了上面,输入过程中,浮层面板内容关键字高亮显示的效果。



关于Autocomplete 中的泛型


泛型的作用非常明显,它最主要的是对浮层面板的构建,如果浮层中的条目不止是 String,我们就需要使用泛型,来提供某个的数据类型。比如下面的效果,其中浮层面板的条目是可以显示更多的信息:

先定义一个数据类 User,记录信息:
class User {
finalStringname;
finalboolman;
finalStringimage;


constUser(this.name,this.man,this.image);


@override
StringtoString(){
return'User{name:$name,man:$man,image:$image}';
}
}


然后在 Autocomplete 的泛型中使用 User 即可。

这样在 _buildOptionsView 中,回调的就是 User 的可迭代对象。如下,封装一个 _UserItem 组件,对条目进行显示。



Autocomplete 源码简看


Autocomplete 本质上依赖于 RawAutocomplete 组件进行构建,可见它是一层简单的封装,简化使用。为我们提供了默认的 optionsViewBuilderfieldViewBuilder,显示一个很丑的界面。也就是说,如果您了解如何定制这两部分内容,您也就会了 RawAutocomplete 组件。

我们先看一下 AutocompleteoptionsViewBuilder 提供的默认显示,其返回的是 _AutocompleteOptions 组件。如下,其实和我们自己实现的也没有太大的区别,只是个默认存在,方便使用的小玩意而已。

另外,对于输入框的构建,使用 _defaultFieldViewBuilder 静态方法完成。

该方法,返回 _AutocompleteField 组件,本质上也就是构建了一个 TextFormField 组件。


Autocomplete 来说,只是 RawAutocomplete 套了个马甲,本质上的功能还是在 RawAutocomplete 的状态类中完成的。如下是 _RawAutocompleteState 的部分代码,可以看出这里的浮层面板,是通过 Overlay 实现的,另外通过 CompositedTransformTargetCompositedTransformFollower 对浮层进行定位。

那本文就这样,如果想简单地实现搜索联想词,Autocomplete 是一个很不错的选择。




长按右侧二维码

查看更多开发者精彩分享




"开发者说·DTalk" 面向中国开发者们征集 Google 移动应用 (apps & games) 相关的产品/技术内容。欢迎大家前来分享您对移动应用的行业洞察或见解、移动开发过程中的心得或新发现、以及应用出海的实战经验总结和相关产品的使用反馈等。我们由衷地希望可以给这些出众的中国开发者们提供更好展现自己、充分发挥自己特长的平台。我们将通过大家的技术内容着重选出优秀案例进行谷歌开发技术专家 (GDE)的推荐。



 点击屏末||即刻报名参与"开发者说·DTalk"





原文标题:Flutter 组件: Autocomplete 自动填充 | 开发者说·DTalk

文章出处:【微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 谷歌
    +关注

    关注

    27

    文章

    6264

    浏览量

    112156

原文标题:Flutter 组件: Autocomplete 自动填充 | 开发者说·DTalk

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    2025华为开发者大赛暨开发者年度会议成功举办

    12月27日-12月28日,以“成就AI原生时代先锋开发者”为主题的2025华为开发者大赛暨开发者年度会议在上海华为练秋湖研发中心举办。本次会议旨在汇聚先锋开发力量,搭建开放共赢的生态
    的头像 发表于 12-31 13:32 1166次阅读

    2025开源鸿蒙开发者激励计划正式启动

    11月21日,2025开放原子开发者大会盛大启幕,聚焦“AI共智,开源共享”主题,吸引了来自全球的开发者、企业技术领袖、社区维护及高校科研力量参会。作为大会的重要组成部分,开源鸿蒙技术分论坛同期
    的头像 发表于 11-27 14:44 902次阅读

    Flutter 移动端开发:集成淘宝 API 实现商品数据实时展示 APP

    在电商蓬勃发展的当下,移动端购物成为主流趋势。对于开发者而言,利用 Flutter 构建一个能够实时展示淘宝商品数据的 APP,既能满足用户便捷获取商品信息的需求,也能为电商业务拓展新的渠道
    的头像 发表于 11-13 09:36 555次阅读

    元服务发布配置开发者服务信息

    您作为开发者的相关信息将面向元服务发布区域的用户公开,其中客服联系方式可能会提供给用户,用于咨询相关问题。 登录AppGallery Connect,点击“APP与元服务”。 选择要发布的元服务
    发表于 10-31 17:58

    2025开放原子开发者大会11月启幕

    开发者年度盛会即将登场!2025开放原子开发者大会将于11月21-22日,在北京北人亦创国际会展中心盛大召开。大会以“一切为了开发者”为主题,汇聚全球开源智慧——国内外优秀开发者、学术
    的头像 发表于 10-24 14:05 1195次阅读

    NVIDIA DRIVE AGX Thor开发者套件重磅发布

    这款由 NVIDIA DriveOS 7 驱动的开发者套件能够帮助开发者们打造出更安全的智能汽车和交通解决方案。
    的头像 发表于 09-04 11:20 1710次阅读

    曙光网络SugonRI开发者社区正式上线

    在人工智能与工业深度融合的大潮中,工业软件正在成为推动产业升级的关键引擎。为了让更多开发者快速掌握工业级编程技术、共享行业实践成果,曙光网络正式推出开发者社区——曙睿(SugonRI)开发者网站
    的头像 发表于 09-04 09:58 1234次阅读

    Android Studio中的Gemini全面支持Dart和Flutter开发

    在 Android Studio 中创建 Android 应用的 Flutter 开发者将迎来一次重大的飞跃: Android Studio 中的 Gemini 已全面支持 Dart
    的头像 发表于 08-06 13:52 1594次阅读
    Android Studio中的Gemini全面支持Dart和<b class='flag-5'>Flutter</b><b class='flag-5'>开发</b>

    矽速科技正式入驻 RuyiSDK 开发者社区,共建 RISC-V 开发者生态!

    近日,深圳矽速科技正式入驻RuyiSDK开发者社区,携手社区共同推动RISC-V技术的发展与广泛应用,为开发者提供一个更加便捷高效的开发环境。关于RuyiSDKRuyiSDK是中国科学院软件研究所
    的头像 发表于 07-10 11:00 1461次阅读
    矽速科技正式入驻 RuyiSDK <b class='flag-5'>开发者</b>社区,共建 RISC-V <b class='flag-5'>开发者</b>生态!

    HDC 2025开发者主题演讲精彩回顾

    日前,华为开发者大会(HDC 2025)进入第二天,行业领袖、技术专家、全球开发者齐聚现场,共同见证这场科技盛会。在开发者主题演讲中,华为技术专家深入解析HarmonyOS的最新技术、体验创新以及
    的头像 发表于 07-09 11:20 1564次阅读

    华为正式启动HarmonyOS 6开发者Beta

    在2025年华为开发者大会(HDC)上,华为正式启动HarmonyOS 6开发者Beta,并全面展示一年多以来与合作伙伴共建鸿蒙生态的创新成果。
    的头像 发表于 06-24 15:42 1077次阅读

    使用 Flutter SDK 3.27.4构建HarmonyOS应用

    /flutter_fluttergit checkout -b oh-3.27.4-dev origin/oh-3.27.4-dev   下载下来之后就可以配置开发环境啦。 配置开发环境 配置好后
    的头像 发表于 06-11 09:15 1173次阅读

    Flutter on Raspberry Pi:从入门到精通的完整指南!

    Flutter。通过遵循本文中概述的步骤,你将获得在树莓派上设置Flutter的知识和信心。无论你是初学者还是经验丰富的Flutter开发者,本指南都将确保你对过程有清晰的
    的头像 发表于 06-06 15:37 1796次阅读
    <b class='flag-5'>Flutter</b> on Raspberry Pi:从入门到精通的完整指南!

    全志科技亮相OpenHarmony开发者大会2025

    近日,OpenHarmony开发者大会 2025(OHDC.2025,以下简称“大会”)在深圳举办。大会正式发布了开源鸿蒙5.1 Release版本,举行了“开源鸿蒙应用技术组件共建启动、开源鸿蒙
    的头像 发表于 06-04 09:16 2483次阅读
    全志科技亮相OpenHarmony<b class='flag-5'>开发者</b>大会2025

    润和软件旗下润开鸿亮相开源鸿蒙开发者大会2025

    近日,开源鸿蒙开发者大会2025(OHDC.2025)于深圳再启新篇,会上正式发布了开源鸿蒙5.1 Release版本,并进行开源鸿蒙应用技术组件共建启动等重要仪式,面向开发者和生态伙伴全面呈现了“Powered by Open
    的头像 发表于 06-03 16:22 1825次阅读