Flutter自定义Appbar搜索框效果

 更新时间:2021年06月23日 14:56:12   作者:飘渺包子  
这篇文章主要为大家详细介绍了Flutter自定义Appbar搜索框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Flutter自定义Appbar搜索框效果的具体代码,供大家参考,具体内容如下

首先看一下实现本次实现的效果。

本来想直接偷懒从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);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android开发实现读取assets目录下db文件的方法示例

    Android开发实现读取assets目录下db文件的方法示例

    这篇文章主要介绍了Android开发实现读取assets目录下db文件的方法,结合实例形式分析了Android针对assets目录下SQLite数据库文件的相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Android编程之分辨率处理相关代码段合集

    Android编程之分辨率处理相关代码段合集

    这篇文章主要介绍了Android编程之分辨率处理相关代码段合集,涉及Android针对分辨率的计算与转换等相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android ViewPager实现左右滑动翻页效果

    Android ViewPager实现左右滑动翻页效果

    这篇文章主要为大家详细介绍了Android ViewPager实现左右滑动翻页效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android自定义控件实现九宫格解锁功能

    Android自定义控件实现九宫格解锁功能

    这篇文章主要为大家详细介绍了Android自定义控件实现九宫格解锁功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android中TextView自动适配文本大小的几种解决方案

    Android中TextView自动适配文本大小的几种解决方案

    在布局中使用的话,注意按照你最大的设备来设置字体大小,这样在小设备上回自动缩放,下面这篇文章主要给大家介绍了关于Android中TextView自动适配文本大小的几种解决方案,需要的朋友可以参考下
    2022-06-06
  • Kotlin中常见内联扩展函数的使用方法教程

    Kotlin中常见内联扩展函数的使用方法教程

    在Kotlin中,使用inline修饰符标记内联函数,既会影响到函数本身, 也影响到传递给它的Lambda表达式,这两者都会被内联到调用处。下面这篇文章主要给大家介绍了关于Kotlin中常见内联扩展函数的使用方法,需要的朋友可以参考下。
    2017-12-12
  • 详解Android 7.0 Settings 加载选项

    详解Android 7.0 Settings 加载选项

    本篇文章主要介绍了Android 7.0 Settings 加载选项,Android 7.0 Settings顶部多了一个建议选项,多了个侧边栏,操作更加便捷了,有兴趣的可以了解一下。
    2017-02-02
  • Android键盘显示与隐藏代码

    Android键盘显示与隐藏代码

    Android键盘显示与隐藏代码,需要的朋友可以参考一下
    2013-05-05
  • Android提高之SurfaceView的基本用法实例分析

    Android提高之SurfaceView的基本用法实例分析

    这篇文章主要介绍了Android提高之SurfaceView的基本用法,非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • Android笔记设计范例之日记APP实现全流程

    Android笔记设计范例之日记APP实现全流程

    这篇文章主要介绍了Android笔记设计范例之日记APP实现全流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01

最新评论