精华内容
下载资源
问答
  • import 'package:flutter/material.dart' ; import 'package:flutter/cupertino.dart' ; import 'package:ios_search_bar/ios_search_bar.dart' ; class SearchPage extends StatefulWidget { SearchPage (); ...
  • flutter 之顶部搜索栏SearchDelegate

    千次阅读 2020-07-13 11:26:34
    实现flutter搜索栏Flutter为我们提供了这个组件SearchDelegate,先看一下效果图哦。 一、定义SearchDelegate class searchBarDelegate extends SearchDelegate<String> { /*这个方法返回一个控件列表,...

    搜索栏是大部分APP都包括的组件,实际开发中需要这个搜索栏,网上阅读了一些资料后。实现flutter的搜索栏。Flutter为我们提供了这个组件SearchDelegate,先看一下效果图哦。
    在这里插入图片描述
    一、定义SearchDelegate

    class searchBarDelegate extends SearchDelegate<String> {
     /*这个方法返回一个控件列表,显示为搜索框右边的图标按钮,这里设置为一个清除按钮,并且在搜索内容为空的时候显示建议搜索内容,使用的是showSuggestions(context)方法:*/
      @override
      List<Widget> buildActions(BuildContext context) {
        return null;
      }
    /*这个方法返回一个控件,显示为搜索框左侧的按钮,一般设置为返回,这里返回一个具有动态效果的返回按钮:*/
      @override
      Widget buildLeading(BuildContext context) {
        return null;
      }
    
      @override
      Widget buildResults(BuildContext context) {
        return null;
      }
    /*这个方法返回一个控件,显示为搜索内容区域的建议内容。*/
      @override
      Widget buildSuggestions(BuildContext context) {
        return null;
      }
    
    /*这个方法返回一个主题,也就是可以自定义搜索界面的主题样式:*/
      @override
      ThemeData appBarTheme(BuildContext context) {
        // TODO: implement appBarTheme
        return super.appBarTheme(context);
      }
    }
    

    实现代码:

    
    import 'package:flutter/material.dart';
    import 'package:flutter_redux/flutter_redux.dart';
    import 'package:ws/common/dao/expense_dao.dart';
    import 'package:ws/model/expense_model.dart';
    import 'package:ws/redux/ws_state.dart';
    import 'package:ws/widget/ws_no_data.dart';
    
    class ExpenseSearch extends SearchDelegate<String>{
      String searchHint = "请输入搜索内容...";
      var monthList = [
        "一月",
        "二月",
        "三月",
        "四月",
        "五月",
        "六月",
        "七月",
        "八月",
        "九月",
        "十月",
        "十一月",
        "十二月",
      ];
    
      var typeList = [
        "差旅费报销单",
        "一般费用报销单",
        "因公临时出国(境)支出表",
        "药费报销单",
        "合同付款审批表",
        "工资系统专用报销表",
      ];
    
      List<ExpenseList> items = new List<ExpenseList>();
    
      @override
      String get searchFieldLabel => searchHint;
      
      @override
      List<Widget> buildActions(BuildContext context) {
        // TODO: implement buildActions
        return [
          IconButton(
            icon: Icon(Icons.clear),
            onPressed: () {
              query = "";
              showSuggestions(context);
            },
          ),
        ];
      }
    
      @override
      Widget buildLeading(BuildContext context) {
        return IconButton(
          icon: AnimatedIcon(
              icon: AnimatedIcons.menu_arrow, progress: transitionAnimation),
          onPressed: () {
            if (query.isEmpty) {
              close(context, null);
            } else {
              query = "";
              showSuggestions(context);
            }
          },
        );
      }
    
      @override
      Widget buildResults(BuildContext context) {
    
        return FutureBuilder(
          future: _loadData(),
          builder: (context, AsyncSnapshot snapshot) {
            return StoreBuilder<WSState>(
                builder: (context, store) {
                  return ListView.builder(
                      physics: AlwaysScrollableScrollPhysics(),
                      itemCount: items?.length == 0 ? 1 : items.length,
                      itemBuilder: (BuildContext context, int index) {
                        if (items.length > 0) {
                          ExpenseList expenseList = items[index];
                          return ListTile(
                            title:Text(expenseList.title),
                            subtitle: Text(expenseList.content),
                          );
                        } else {
                          return NoData();
                        }
                      });
    
                });
          }
        );
        ///展示搜索结果
    
      }
      @override
      Widget buildSuggestions(BuildContext context) {
        return Container(
          margin: EdgeInsets.only(left: 16.0, right: 16.0),
          child: ListView(
            primary: false,
            shrinkWrap: true,
            children: <Widget>[
              SizedBox(height: 10.0),
              Text(
                "报销月份:",
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 10.0),
              Wrap(
                spacing: 8.0,
                runSpacing: 8.0,
                children: monthList.map((childNode) {
                  return InkWell(
                    child: new ClipRRect(
                      borderRadius: BorderRadius.circular(3.0),
                      child: Container(
                        padding: EdgeInsets.all(3.0),
                        color:Colors.grey,
                        child: Text(
                          childNode,
                          style: TextStyle(
                            fontSize: 16,
                            color: Colors.white,
                            shadows: [
                              BoxShadow(
                                  color: Colors.grey, offset: Offset(0.2, 0.2))
                            ],
                          ),
                        ),
                      ),
                    ),
                    onTap: () {
                      _loadData();
                      Future.delayed( Duration(seconds: 2), () async {
                        searchHint = "";
                        query = childNode;
                        showResults(context);
                      });
                    },
                  );
                }).toList(),
              ),
    
              SizedBox(height: 10.0),
              Text(
                "报销类型:",
                style: TextStyle(fontSize: 18),
              ),
              SizedBox(height: 10.0),
              Wrap(
                spacing: 8.0,
                runSpacing: 8.0,
                children: typeList.map((childNode) {
                  return InkWell(
                    child: new ClipRRect(
                      borderRadius: BorderRadius.circular(3.0),
                      child: Container(
                        padding: EdgeInsets.all(3.0),
                        color:Colors.grey,
                        child: Text(
                          childNode,
                          style: TextStyle(
                            fontSize: 16,
                            color: Colors.white,
                            shadows: [
                              BoxShadow(
                                  color: Colors.grey, offset: Offset(0.2, 0.2))
                            ],
                          ),
                        ),
                      ),
                    ),
                    onTap: () {
                      _loadData();
                      Future.delayed( Duration(seconds: 2), () async {
                        searchHint = "";
                        query = childNode;
                        showResults(context);
                      });
                    },
                  );
                }).toList(),
              ),
            ],
          ),
        );
      }
    
      _loadData() async {
        //网络加载
        var data = await ExpenseDao.getInitExpense(1, 20);
        Expense expense = Expense.fromJson(data);
        items=expense.list;
      }
    }
    
    
    展开全文
  • Flutter - 导航栏搜索框实现

    千次阅读 2020-05-07 17:41:40
    demo 地址: https://github.com/iotjin/jh_flutter_demo 效果图: 代码 import 'package:flutter/material.dart'; import 'package:jh_flutter_demo/configs/...import 'package:jh_flutter_demo/JhTools/JhFo...

    demo 地址: https://github.com/iotjin/jh_flutter_demo

    效果图:

    在这里插入图片描述

    代码

    import 'package:flutter/material.dart';
    import 'package:jh_flutter_demo/configs/colors.dart';
    import 'package:jh_flutter_demo/JhTools/JhForm/jhLoginTextField.dart';
    
    
    class SearchTest3Page extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
    
    
        return Scaffold(
          appBar:
    
    //      cursorColor: Colors.white, //设置光标
          AppBar(
            backgroundColor: kThemeColor,
            titleSpacing:15,
            automaticallyImplyLeading: false,//隐藏返回箭头
            title:
            Container(
              decoration: new BoxDecoration(
                border: Border.all(color: Colors.grey, width: 1.0), //灰色的一层边框
                color: Colors.white,
                borderRadius: BorderRadius.all( Radius.circular(5.0)),
              ),
              alignment: Alignment.center,
              height: 38,
    //           padding: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0),
              child: JhLoginTextField(
                leftWidget: Icon(Icons.search,size: 30,),
                hintText: '请输入搜索信息',
                isShowDeleteBtn: true,
                isDense: true,
              ),
            ),
            actions: <Widget>[
    
              InkWell(
                child:
                Container(width: 50,height: 50,
                  child:  Center(child:
                  Text("搜索"),
                  ),
                ),
    
                onTap: () {
                },
              )
    
    
            ],
          ),
          body:
          RaisedButton(child: Text("返回"),
            onPressed: (){
              Navigator.pop(context);
            },
          ),
    
        );
      }
    
    
    
    }
    
    展开全文
  • 动画的SearchAppBar小部件,将与Flutter一起使用。 用法 只需将SearchAppBar小部件用作常规AppBar。 小部件中唯一需要的属性称为searcher 。 您必须在您的类(例如Bloc)中实现Searcher接口,以控制数据列表(类型...
  • 可扩展的浮动搜索栏Flutter实现,也称为持久搜索,类似于Google在自己的应用中广泛使用的实现。 单击查看完整的示例。 正在安装 将其添加到您的pubspec.yaml文件中: dependencies : material_floating_search_...
  • Flutter自定义底部导航

    千次阅读 2019-05-13 17:45:34
    之前一直使用(Flutter SDK 1.2.1稳定版),遇到一个很不爽的问题——BottomNavigationBarItem 选中时 title中的文字会放大。有什么设置可以去掉这个放大呢? 国内的APP中很少有navigation item 有动画的!!! 即...

    一、原因

    之前一直使用(Flutter SDK 1.2.1稳定版),遇到一个很不爽的问题——BottomNavigationBarItem 选中时 title中的文字会放大。有什么设置可以去掉这个放大呢? 国内的APP中很少有navigation item 有动画的!!!
    问题图片
    即搜索比首页的字号大,而且切换的时候是有动画的。

    二、解决

    在BottomNavigationBar的api中根本没有找到对应的设置,于是乎重写了一个Widget,代码如下,仅供参考!

     int _currentIndex = 0;
    
      Widget _buildBottomNavigationBar(){
        return Container(
          color: Colors.white,
          child: SafeArea(
            child: SizedBox(
              height: 54.0,
              child: Card(
                elevation: 0.0,
                shape: RoundedRectangleBorder(),
                margin: EdgeInsets.all(0.0),
                child: Row(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    _buildBottomItem(title: '首页',icon: Icons.home,index: 0),
                    _buildBottomItem(title: '搜索',icon: Icons.search,index: 1),
                    _buildBottomItem(title: '消息',icon: Icons.message,index: 2),
                    _buildBottomItem(title: '我的',icon: Icons.account_circle,index: 3),
                  ],
                ),
              ),
            ),
          ),
        );
      }
    
      Widget _buildBottomItem({String title,IconData icon, int index}){
    
        Color _colors = index == _currentIndex ? Colors.blue : Colors.grey;
    
        return Expanded(
          child: InkResponse(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Icon(icon,color: _colors,),
                Text(
                  title,
                  style: TextStyle(color: _colors,fontSize: 12.0),
                )
              ],
            ),
            onTap: (){
              _controller.jumpToPage(index);  // PageView 页面跳转
              setState(() {
                _currentIndex = index;
              });
            },
          ),
        );
      }
    

    最后将_buildBottomNavigationBar()函数在Scaffold下的bottomNavigationBar属性后面执行就行了。

      @override
      Widget build(BuildContext context) {
        return Scaffold(
           body: ...     // 这部分我用的PageView,就不贴出来了
           bottomNavigationBar:_buildBottomNavigationBar(),
        );
      }
    
    展开全文
  • 本来想直接偷懒从flutter pub上找个能用的使用起来,但是看了下发现都与目前ui效果相差很大,于是乎决定自己实现一个。整体的话比较简单,本来也是为了练手而做的。 为了方便处理statusbar的高度适配,于是乎直接...

    首先看一下实现本次实现的效果。
    在这里插入图片描述
    在这里插入图片描述
    本来想直接偷懒从flutter pub上找个能用的使用起来,但是看了下发现都与目前ui效果相差很大,于是乎决定自己实现一个。整体的话比较简单,本来也是为了练手而做的。

    为了方便处理statusbar的高度适配,于是乎直接依托于Appbar进行了实现,这样就可以不用处理状态栏适配了。

    class _HotWidgetState extends State<HotWidget> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            titleSpacing: 0,  //清除title左右padding,默认情况下会有一定的padding距离
            toolbarHeight: 44, //将高度定到44,设计稿的高度。为了方便适配,
            //推荐使用插件flutter_screenutil做屏幕的适配工作
            backgroundColor: Colors.white,
            elevation: 0,
            //由于title本身是接受一个widget,所以可以直接给他一个自定义的widget。
            title: SearchAppBar(
              hintLabel: "电影/电视剧/影人",
            ),
          ),
          body: Container(),
        );
      }
    }
    

    flutter中控件定义推荐的是使用组合控件实现,这个是真的很酷,因为万物皆widget,组合起来很方便。

    import 'package:flutter/material.dart';
    import 'package:flutter_demo_001/ui.theme/color.dart';
    import 'package:flutter_demo_001/ui.theme/theme.dart';
    import 'package:flutter_demo_001/utils/padding.dart';
    
    class SearchAppBar extends StatefulWidget {
      SearchAppBar({Key? key, required this.hintLabel}) : super(key: key);
    
      final String hintLabel;
    
      @override
      State<StatefulWidget> createState() {
        return SearchAppBarState();
      }
    }
    
    class SearchAppBarState extends State<SearchAppBar> {
      late FocusNode _focusNode;
    
      ///默认不展示控件
    
      bool _offstage = true;
    
      ///监听TextField内容变化
      final TextEditingController _textEditingController = TextEditingController();
    
      @override
      void initState() {
        super.initState();
        _focusNode = FocusNode();
        _textEditingController.addListener(() {
          var isVisible = _textEditingController.text.isNotEmpty;
          _updateDelIconVisible(isVisible);
        });
      }
    
      _updateDelIconVisible(bool isVisible) {
        setState(() {
          _offstage = !isVisible;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return SizedBox(
          width: double.infinity,
          height: 30,
          child: Row(
            children: [
              Expanded(
                flex: 1,
                child: Container(
                  height: double.infinity,
                  margin: const EdgeInsets.only(left: 16),
                  decoration: BoxDecoration(
                      color: colorF5F6FA, borderRadius: BorderRadius.circular(4)),
                  child: Row(
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      paddingOnly(const EdgeInsets.only(left: 8)),
                      Image.asset(
                        "images/home_search.png",
                        width: 16,
                        height: 16,
                      ),
                      paddingOnly(const EdgeInsets.only(left: 8)),
                      Expanded(
                        flex: 1,
                        child: TextField(
                          controller: _textEditingController,
                          autofocus: true,
                          focusNode: _focusNode,
                          style: TextStyle(fontSize: 14, color: color333),
                          decoration: boxInputDecoration(widget.hintLabel),
                          maxLines: 1,
                        ),
                      ),
                      paddingOnly(const EdgeInsets.only(right: 8)),
                      Offstage(
                        offstage: _offstage,
                        child: GestureDetector(
                          onTap: () => {_textEditingController.clear()},
                          child: Image.asset(
                            "images/home_search_cancel.png",
                            width: 16,
                            height: 16,
                          ),
                        ),
                      ),
                      paddingOnly(const EdgeInsets.only(right: 8)),
                    ],
                  ),
                ),
              ),
              GestureDetector(
                onTap: () {
                  _focusNode.unfocus();
                },
                child: Container(
                  padding: const EdgeInsets.only(left: 16, right: 16),
                  child: Text("取消",
                      style: TextStyle(fontSize: 16, color: Color(0xFF3D7DFF))),
                ),
              ),
            ],
          ),
        );
      }
    
      @override
      void dispose() {
        super.dispose();
        _focusNode.unfocus();
      }
    }
    

    最后为了美观,需要让状态栏也变成透明。

    void main() {
      //固定屏幕旋转方向
      WidgetsFlutterBinding.ensureInitialized();
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
          .then((_) {
        runApp(const MyApp());
      });
      //设置状态栏透明
      if (Platform.isAndroid) {
        SystemUiOverlayStyle systemUiOverlayStyle = const SystemUiOverlayStyle(
          statusBarColor: Colors.transparent, //设置为透明
        );
        SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
      }
    }
    
    展开全文
  • 会员名单 这是Onuralp AVCI制作的扑打应用程序。 应用程序具有3个不同的类,分别称为“ Hipo.dart”,“ Member.dart”和“ MemberList.dart”。 Hipo.dart:这是一个简单的类,具有两个属性:'position'是具有...
  • 搜索插件 : Flutter Intl 项目配置 添加依赖: dev_dependencies: ... //add this flutter_localizations: sdk: flutter 在菜单的Tool下找到Flutter Intl 并选择Initalize for the project, 配置结束后效果...
  • Github用户搜索Flutter应用程序 Flutter应用程序,用于使用Github的API搜索用户。 使用的应用架构: BLoC(业务逻辑和组件)。 使用的Flutter软件包: 任务: 使用BLoC体系结构。 创建一个具有渐变背景且与状态...
  • 本系列可能会伴随大家很长时间,这里我会从0开始搭建一个「网易云音乐」的APP出来。下面是该APP 功能的思维导图:前期回顾:本篇为第九篇,在这里我们会搭建「搜索页面、底部...
  • 搜索栏 一个新的Flutter项目。 入门 该项目是Flutter应用程序的起点。 如果这是您的第一个Flutter项目,那么有一些资源可以帮助您入门: 要获得Flutter入门方面的帮助,请查看我们的,其中提供了教程,示例,有关...
  • 窗口小部件搜索栏范围选择器安装将其添加到包的pubspec.yaml文件依赖项中:elastic_widgets:0.0.1用法搜索栏:ElasticSeekBar(valueListener:(value){print(“ slider value:$ value”);},大小:大小(300...
  • 一个简单且自动的,用于颤振(Dart)的材料搜索栏。 注意:使用flutter_search_bar而不是search_bar -我拥有这两个软件包,但我只是被search_bar锁定了一点,因此不会被更新。 屏幕截图 正常状态(搜索尚未处于...
  • 从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边二维码或者搜索”IT工匠“关注微信公众号/头条号(微信...
  • 从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边二维码或者微信搜索”IT工匠“关注微信公众号哦,会同步推...
  • 从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边二维码或者微信搜索”IT工匠“关注微信公众号哦,会同步推...
  • 如何使用Flutter开发web应用

    万次阅读 2019-06-21 22:48:53
    Flutter系列的文章我应该会持续更新,从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边二维码或者搜索”IT...
  • 从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边二维码或者搜索”IT工匠“关注微信公众号/头条号(微信...
  • 从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边二维码或者微信搜索”IT工匠“关注微信公众号哦,会同步推...
  • 给配置Flutter环境变量

    千次阅读 2019-03-20 14:18:34
    当你完成了下载并且解压缩 Flutter 到合适的目录位置之后,只能在 ...在左下角的搜索栏中输入 “env”,选在 “编辑系统环境变量” ,点击 “环境变量” ,如图所示: 在弹出的窗口,下面的 “系统变量” 那部分...
  • Flutter 项目的创建,使用 Row 编写的顶部菜单选项 3、首页面的左侧拉菜单,菜单的移动适配,在手机模式下使用侧拉菜单 4、右侧搜索框的实现,圆角边框的搜索框的实现 5、右侧分类的实现,圆角边框样式的分类模块...
  • 默认情况下,主页为主页,顶部标题包含各种元素,包括配置文件信息,搜索栏和实时流按钮。 它旁边是带有各种类别的水平滚动列表。 页面的中心内容包括来自推荐/订阅频道的视频,作为垂直滚动列表,保持了经典的...
  • Flutter官方国际化方案

    千次阅读 2020-06-05 11:48:42
    搜索flutter Intl”,安装该插件,重启AndroidStudio 2.配置与初始化 配置 pubspec.yaml文件新增本地化依赖: dependencies: // Other dependencies... flutter_localizations: sdk: flutter 然后package ...
  • 小白flutter安装指南

    2019-07-06 15:06:09
    作为一个面对120fps慕名而来的小白,被网上五花八门的教程迷的晕头转向,最后发现,还是官方文档最靠谱,就此归纳本人windows端的配置爬坑 ...在搜索栏输入env,添加用户变量 PUB_HOSTED_URL https://pu...
  • ui效果 注意点 textfield中内容与 prefixIcon, ...import 'package:flutter/material.dart'; class SearchBar extends StatefulWidget { final bool showLocation; final Function goBackCallback; final String i
  • 语言:English (United States) A handy browser extension to search official docs in the ...在地址中输入"ft"并按下tab键,然后输入关键字进行搜索(https://github.com/CodeNeverStops/flutter-search-extension)
  • XD到Flutter插件 请先阅读 感谢您帮助测试此插件!我们的目标是发布可能的最佳插件,您的反馈对此很重要。...在Adobe XD菜单中,转到“插件”>“发现插件”,然后搜索并安装“ Flutter”插件。现在,它将显示在XD
  • 从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边二维码或者微信搜索”IT工匠“关注微信公众号哦,会同步推...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

flutter搜索栏