一个顶N个!Flutter界面开发提速大杀器Getwidget 🚀(五)

5,926 阅读8分钟

前言

Flutter 是 Google 开源的应用开发框架,仅通过一套代码就能构建支持Android、iOS、Windows、Linux等多平台的应用。Flutter的性能非常高,拥有120fps的刷新率,也是目前非常流行的跨平台UI开发框架。

本专栏为大家收集了Github上近70个优秀开源库,后续也将持续更新。希望可以帮助大家提升搬砖效率,同时祝愿Flutter的生态越来越完善🎉🎉。

Getwidget 索引

第一篇:按钮 GFButton、角标 GFBadge、头像 GFAvatar、图片 GFImage、卡片 GFCard

第二篇:轮播图 GFCarousel、列表模版 GFListTile、标签栏 GFTabBar、浮动组件 GFFloatingWidget

第三篇:提示框 GFToast、开关 GFToggle、文字排版 GFTypography、抽屉 GFDrawer、弹窗 GFAlert、折叠卡片 GFAccordion

第四篇:导航条 GFAppBar、搜索栏 GFSearchBar、评分组件 GFRating、加载提示 GFLoader、进度条 GFProgressBar

👉 第五篇:闪光组件 GFShimmer、动画 GFAnimation、边框 GFBorder、底部抽屉 GFBottomSheet、复选框 GFCheckbox

第六篇:可选列表模板 GFCheckboxListTile、下拉选择框 GFMultiSelect、介绍屏GFIntroScreen、单选按钮 GFRadio、粘性标题 GFStickyHeader

正文

一、🚀 轮子介绍

  • 名称:getwidget
  • 概述:GetWidget完全免费,内置了1000多个预构建的小组件,您可以使用这些小组件加快自己开发进程并构建出色的应用。
  • 出版商:navin10sharma@gmail.com
  • 仓库地址:getwidget
  • 推荐指数: ⭐️⭐️⭐️⭐️⭐️
  • 常用指数: ⭐️⭐️⭐️⭐️⭐️
  • 预览: 长图预览请戳

二、⚙️ 安装及使用

dependencies:
  getwidget: ^2.0.5
import 'package:getwidget/getwidget.dart';

三、🗂 组件示例

21. 闪光组件 GFShimmer

shimmer_2b9f0c0910.webp

属性及含义描述

属性描述
child用以显示微光效果的子组件
direction动画方向,默认GFShimmerDirection.leftToRight
duration动画时长,默认1.5s
showGradient是否显示渐变色
gradient渐变色,showGradient为true时生效
shimmerEffectCount动画执行次数,默认0(无限循环)
showShimmerEffect控制动画效果的活跃状态
mainColor主要颜色
secondaryColor次要颜色

1.GFShimmer和之前分享的 Shimmer 基本一致,通过包裹组件实现微光动画效果,一般用于加载动画,这是一个简单的示例⬇️:

shimmer.gif

GFShimmer(
    child: Container(
        width: 100,
        height: 100,
        // 这里的颜色不会在GFShimmer中显示,但不能为transparent
        color: Colors.green,
))

2.这里包裹的是一个行列样式,也可以包裹GFListTile等封装好的组件来快速实现(SizedBox和透明的Container不会被GFShimmer显示):

shimmer2.gif

GFShimmer(child: shimmerTest())

Widget shimmerTest() {
    return Padding(
        padding: const EdgeInsets.symmetric(horizontal: 16),
        child: Row(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
            Container(
                width: 80,
                height: 80,
                color: Colors.white,
            ),
            const SizedBox(width: 12),
            Expanded(
                child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                        Container(
                        width: double.infinity,
                        height: 15,
                        color: Colors.white,
                        ),
                        const SizedBox(height: 6),
                        Container(
                            width: MediaQuery.of(context).size.width * 0.5,
                            height: 15,
                            color: Colors.white,
                        ),
                        const SizedBox(height: 6),
                        Container(
                            width: MediaQuery.of(context).size.width * 0.25,
                            height: 15,
                            color: Colors.white,
                        ),
                    ],
                ),
            )
        ],
    ),);
}}

3.渐变色微光效果(目前有明显的顿挫,不知道后期会不会优化,两种颜色建议使用属性mainColor和secondaryColor,多色建议使用 Shimmer):

textshimmer.gif

GFShimmer(
    child: const Text(
        'GF Shimmer',
        style: TextStyle(fontSize: 48, fontWeight: FontWeight.w700),
        ),
    showGradient: true,
    gradient: LinearGradient(colors: [Colors.red, Colors.blue]),
),

22.动画 GFAnimation

Animation-Rotation_xN-DtCumD.gif

属性及含义描述

属性描述
duration动画执行的持续时间
reverseDuration反向动画执行的持续时间
alignment定义动画组件在动画期间的对齐方式
activeAlignment定义动画组件在动画期间的对齐方式(在 onTap 之后)
child显示动画效果的子组件
curve动画曲线, 默认为 Curves.linear
typeGFAnimation 的类型,即 align、size、container、rotateTransition、scaleTransition、slideTransition 和 textStyle
width定义 AnimatedContainer 初始宽度
changedWidth定义 AnimatedContainer 的宽度,它可以在动画期间展开
height定义 AnimatedContainer 初始高度
changedHeight定义 AnimatedContainer 的高度,它可以在动画期间展开
activeColor定义onTap触发时 AnimatedContainer 的颜色
color定义 AnimatedContainer 的颜色
padding定义 child 或 AnimatedContainer 的填充
margin定义 child 或 AnimatedContainer 的边距
onTap用户点击 child 时的调用
turnsAnimation对于 GFAnimationType.rotateTransition,可以在 RotationTransition 小部件中添加自定义的转弯动画
scaleAnimation对于 GFAnimationType.scaleTransition,可以在 ScaleTransition 小部件中添加自定义缩放动画
controller动画的控制器。
textDirection定义 AnimatedDefaultTextStyle 的文本方向,即 [ltr,rtl]
slidePosition对于 GFAnimationType.slideTransition,它为组件的位置设置动画
style文本风格
textAlign文本对齐方式
textOverflow文本溢出处理
maxLines最大行数
textWidthBasis文本基础宽度
fontSize字号
fontWeight字重

1.旋转动画示例⬇️:

屏.gif

class GFAnimationPage extends StatefulWidget {
    const GFAnimationPage({Key? key}) : super(key: key);
    @override
    State<GFAnimationPage> createState() => _GFAnimationPagePageState();
}

class _GFAnimationPagePageState extends State<GFAnimationPage> with TickerProviderStateMixin {
    late AnimationController controller;
    late Animation<double> animation;
    bool isWorking = false;

    @override
    void initState() {
        controller = AnimationController(duration: const Duration(seconds: 5), vsync: this);
        animation = CurvedAnimation(parent: controller, curve: Curves.linear);
        super.initState();
    }
    
    @override
    void dispose() {
        controller.dispose();
        super.dispose();
    }

    ...

    GFAnimation(
        turnsAnimation: animation,
        controller: controller,
        type: GFAnimationType.rotateTransition,
        alignment: Alignment.center,
        child: Image.asset(
            'images/mypicture.png',
            width: 80,
            height: 80,
        ),
    ),

    GFButton(
        text: isWorking ? '停止' : ' 播放',
        color: isWorking ? Colors.green : Colors.blue,
        onPressed: () {
            isWorking ? controller.stop() : controller.repeat();
        setState(() {
        isWorking = !isWorking;
        });
    }),
    
}

2.缩放动画:

suofang.gif

...

GFAnimation(
    turnsAnimation: animation,
    controller: controller,
    type: GFAnimationType.scaleTransition,
    alignment: Alignment.center,
    child: Image.asset(
        'images/mypicture.png',
        width: 80,
        height: 80,
    ),
),

3.对齐动画:

pingyi.gif

...

GFAnimation(
    turnsAnimation: animation,
    controller: controller,
    type: GFAnimationType.align,
    alignment:
    isWorking ? Alignment.bottomLeft : Alignment.bottomRight,
    child: Image.asset(
        'images/mypicture.png',
        width: 80,
        height: 80,
    ),
)

4.过渡动画:

guodu.gif

...

offsetAnimation = Tween<Offset>(
    begin: Offset(0, 0),
    end: Offset(1, 0),
).animate(CurvedAnimation(
    parent: controller,
    curve: Curves.linear,
));

...

Container(
    color: Colors.white,
    width: MediaQuery.of(context).size.width,
    child: GFAnimation(
        controller: controller,
        slidePosition: offsetAnimation,
        type: GFAnimationType.slideTransition,
        child: Image.asset(
            'images/mypicture.png',
            width: 80,
            height: 80,
        ),
    ),
)

5.一个可以在给定的时间内自动转换尺寸的动态组件:

chicun.gif

bool selected = false;
late AnimationController controller;
late Animation<double> animation;

@override
void initState() {
    super.initState();
    controller = AnimationController(duration: const Duration(seconds: 2), vsync: this);
    animation = CurvedAnimation(parent: controller, curve: Curves.linear);
    controller.repeat();
}

@override
void dispose() {
    controller.dispose();
    super.dispose();
}

Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
        Text('data'),
        GFAnimation(
            onTap: () {
                if (mounted) {
                    setState(() {
                        selected = !selected;
                    });
                }
            },
            width: selected ? 100 : 50,
            height: selected ? 100 : 50,
            type: GFAnimationType.size,
            controller: controller,
            child: Image.asset(
                'images/mypicture.png',
                width: 80,
                height: 80,
            ),
        ),
        Row(
            children: [
                Expanded(child: SizedBox()),
                GFButton(onPressed: () {})
            ],
        )
    ],
)

6.动画容器:

rongqi.gif

late AnimationController controller;
late Animation<double> animation;
double fontSize = 30;

@override
void initState() {
    super.initState();
    controller = AnimationController(duration: const Duration(seconds: 3), vsync: this);
    animation = CurvedAnimation(parent: controller, curve: Curves.linear);
    controller.repeat();
}

@override
void dispose() {
    controller.dispose();
    super.dispose();
}

Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: [
        Text('这是一段文字'),
        GFAnimation(
            width: 50,
            changedWidth: 100,
            height: 50,
            changedHeight: 100,
            activeColor: Colors.transparent,
            color: Colors.transparent,
            fontSize: fontSize,
            type: GFAnimationType.container,
            child: Image.asset(
                'images/mypicture.png',
                width: 80,
                height: 80,
            ),
        ),
        Row(
            children: [
                Expanded(child: SizedBox()),
                GFButton(text: '这是个按钮', onPressed: () {})
            ],
        )
    ],
)

23.边框 GFBorder

GW_Borders_5a797fcdc5.png.webp

属性及含义描述

属性描述
childWidget 类型的子元素,可以是任何组件或文本等
paddingchild 的填充
strokeWidthdouble 类型,用于定义边框的粗细
color用于更改边框类型的颜色
dashedLine用于实现边框实线和虚线的数组,例如dashedLine: [14, 4], 这里的14代表单个实线长度,4代表虚线长度
typeGFBorderType 的类型,用于定义不同类型的边框,即圆形、矩形 和椭圆形
radius边框的圆角属性

1.基础样式⬇️:

image.png

GFBorder(
    color: Color(0xFF19CA4B),
    type: GFBorderType.rect,
    child: Image.asset(
        'images/picture.png',
        width: 200,
        fit: BoxFit.fitWidth,
    ),
)

2.虚线边框:

image.png

GFBorder(
    color: Color(0xFF19CA4B),
    // 这里的14代表单个实线长度,4代表虚线长度
    dashedLine: [14, 4],
    type: GFBorderType.rect,
    child: Image.asset(
        'images/picture.png',
        width: 200,
        fit: BoxFit.fitWidth,
    ),
)

3. 点边框:

image.png

GFBorder(
    color: Color(0xFF19CA4B),
    dashedLine: [1, 2],
    type: GFBorderType.rect,
    child: Image.asset(
        'images/picture.png',
        width: 200,
        fit: BoxFit.fitWidth,
    ),
)

4.圆角边框:

image.png

GFBorder(
    radius: Radius.circular(20),
    color: Color(0xFF19CA4B),
    dashedLine: [2, 0],
    type: GFBorderType.rRect,
    child: Container(
        height: 100,
        color: Color(0xFFE9FFEF),
    ),
)

5.椭圆形边框:

image.png

GFBorder(
    type: GFBorderType.oval,
    dashedLine: [2, 0],
    color: Color(0xFF19CA4B),
    strokeWidth: 2,
    child: Center(child: Text('Oval Border')),
)

6.圆形边框(虚线、点等同理):

image.png

SizedBox(
    width: 100,
    height: 100,
    child: GFBorder(
        type: GFBorderType.circle,
        dashedLine: [1, 0],
        color: Color(0xFF19CA4B),
        strokeWidth: 2,
        child: Center(
        child: Text(
            'Circular Border',
            textAlign: TextAlign.center,
        )),
    ),
),

24.底部抽屉 GFBottomSheet

bottom.gif

属性及含义描述

属性描述
minContentHeight内容的最小高度。当 enableExpandableContent 为 false 时生效,必须大于或等于0,默认值为 0
maxContentHeight内容的最大高度。必须大于等于0。默认值为300
stickyHeaderGFBottomSheet 的表头。可以通过滑动或点击 stickyHeader 进行交互
contentBodyGFBottomSheet 的主体。可以通过滑动或点击 contentBody 进行交互
stickyFooterGFBottomSheet 的底部。可以通过滑动或点击 stickyFooter 进行交互
stickyFooterHeight定义 GFBottomSheet 的底部高度
stickyHeaderHeight定义 GFBottomSheet 的表头高度
elevation可以理解为垂直高度,控制 GFBottomSheet 下方的阴影。必须大于等于 0,默认值为 0。
enableExpandableContent是否允许 contentBody 展开。默认值为 false。
controllerGFBottomSheet控制器
animationDuration展开 / 收起动画持续时长

示例代码⬇️:

import 'package:flutter/material.dart';
import 'package:getwidget/getwidget.dart';

class GFBottomSheetPage extends StatefulWidget {
    const GFBottomSheetPage({Key? key}) : super(key: key);
    @override
    State<GFBottomSheetPage> createState() => _GFBottomSheetPagePageState();
}

class _GFBottomSheetPagePageState extends State<GFBottomSheetPage> {
    final GFBottomSheetController controller = GFBottomSheetController();
    @override
    Widget build(BuildContext context) {
    return Scaffold(
    backgroundColor: Colors.blueGrey,
        bottomSheet: GFBottomSheet(
            animationDuration: 500,
            controller: controller,
            maxContentHeight: 150,
            stickyHeaderHeight: 100,
            stickyHeader: Container(
                decoration: BoxDecoration(
                    color: Colors.white,
                    boxShadow: [BoxShadow(color: Colors.black45, blurRadius: 0)]),
                child: const GFListTile(
                    avatar: GFAvatar(
                        backgroundImage: AssetImage('images/mypicture.png'),
                    ),
                    titleText: '晚夜',
                    subTitleText: 'Flutter工程师',
                ),
            ),
            contentBody: Container(
                height: 250,
                margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
                child: ListView(
                shrinkWrap: true,
                physics: const ScrollPhysics(),
                children: const [
                    Center(
                    child: Text(
        'Flutter 是 Google 开源的应用开发框架,拥有120fps的刷新率,也是目前非常流行的跨平台UI开发框架。\n本专栏为大家收集了Github上近70个优秀开源库,后续也将持续更新。希望可以帮助大家提升搬砖效率,同时祝愿Flutter的生态越来越完善🎉🎉。',
                        style: TextStyle(
                        fontSize: 15, wordSpacing: 0.3, letterSpacing: 0.2),
                        ))
                    ],
                ),
            ),
            stickyFooter: Container(
                color: GFColors.SUCCESS,
                child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                        Text(
                            'Flutter轮子推荐',
                            style: TextStyle(
                                fontSize: 18,
                                fontWeight: FontWeight.bold,
                            color: Colors.white),
                        ),
                        Text(
                            'Getwidget',
                            style: TextStyle(fontSize: 15, color: Colors.white),
                        ),
                    ],
                ),
            ),
        stickyFooterHeight: 50,
    ),
    floatingActionButton: FloatingActionButton(
        backgroundColor: GFColors.SUCCESS,
        child: controller.isBottomSheetOpened
        ? Icon(Icons.keyboard_arrow_down)
        : Icon(Icons.keyboard_arrow_up),
        onPressed: () {
            controller.isBottomSheetOpened
            ? controller.hideBottomSheet()
            : controller.showBottomSheet();
        }),
        );
    }
}


25.复选框 GFCheckbox

Gw_Checkboxes_3d60710f66.png.webp

属性及含义描述

属性描述
type复选框类型
size复选框尺寸
activeBgColor选中背景色
inactiveBgColor未选中背景色
activeBorderColor选中边框颜色
inactiveBorderColor未选中边框颜色
onChanged状态改变回调
value是否选中
activeIcon选中图标样式
inactiveIcon未选中图标样式
customBgColor自定义样式背景色
autofocus在真实状态下,当当前范围内没有其他节点处于焦点时,此复选框将被选为初始焦点
focusNode一个可选的焦点节点,用作此复选框的焦点节点。

1.基础样式(带圆角)⬇️:

check.gif

GFCheckbox(
    size: GFSize.SMALL,
    activeBgColor: GFColors.SUCCESS,
    onChanged: (value) {
        setState(() {
            isChecked = value;
        });
    },
    value: isChecked,
)

2.正方形样式:

square.gif

type: GFCheckboxType.square,

3.圆形样式:

yuan.gif

type: GFCheckboxType.circle,

4.自定义样式:

custom.gif

GFCheckbox(
    type: GFCheckboxType.square,
    activeBgColor: GFColors.SECONDARY,
    activeIcon: Icon(Icons.sentiment_satisfied),
    onChanged: (value) {
        setState(() {
            isChecked = value;
        });
    },
    value: isChecked,
    inactiveIcon: Icon(Icons.sentiment_dissatisfied),
)

5.示例:

group.gif

bool isSmileChecked = false;
bool isMiddleChecked = false;
bool isLargeChecked = false;

GFCard(
    content: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: <Widget>[
            GFCheckbox(
                size: GFSize.SMALL,
                activeBgColor: GFColors.DANGER,
                onChanged: (value) {
                    setState(() {
                        isSmileChecked = value;
                        });
                    },
                value: isSmileChecked,
                inactiveIcon: null,
            ),
            GFCheckbox(
                activeBgColor: GFColors.SECONDARY,
                onChanged: (value) {
                    setState(() {
                        isMiddleChecked = value;
                    });
                },
                value: isMiddleChecked,
                inactiveIcon: null,
            ),
            GFCheckbox(
                size: GFSize.LARGE,
                activeBgColor: GFColors.SUCCESS,
                onChanged: (value) {
                    setState(() {
                        isLargeChecked = value;
                    });
                },
                value: isLargeChecked,
                inactiveIcon: null,
            ),
        ],
    ),
)