flutter 小案例

右滑返回上一页案例

在苹果手机上有一种操作叫做右滑返回上一页,一些不错的应用都有类似的操作,随着苹果手机越来越多,这种操作开始普遍,在安卓手机上也开始使用。实现这种右滑返回上一页的操作。

Cupertino UI

其实早都知道Flutter有两套UI模板,一套是material,另一套就是Cupertino。Cupertino主要针对的的就是IOS系统的UI,所以用的右滑返回上一级就是在这个Cupertino里。

Cupertino的引入方法

直接使用import引入就可以了,代码如下:

import 'package:flutter/cupertino.dart';

引入了cupertino的包之后,就可以使用皮肤和交互效果的特性了。要用的右滑返回上一页也是皮肤的交互特性,直接使用就可以了。

CupertinoPageScaffold

这个和以前使用material的Scaffold类似,不过他里边的参数是child,例如下面的代码.

return CupertinoPageScaffold(
  child: Center(
    child: Container(
      height: 100.0,
      width:100.0,
      color: CupertinoColors.activeBlue,
      child: CupertinoButton(
        child: Icon(CupertinoIcons.add),
        onPressed: (){
          Navigator.of(context).push(
            CupertinoPageRoute(builder: (BuildContext context){
              return RightBackDemo();
            })
          );
        },
      ),
    ),
  ),
);

在Cupertino下也有很多Widget控件,他们都是以Cupertino开头的,这就让我们很好区分,当然两种皮肤是可以进行混用的。

整个案例代码
这个案例就两个主要文件,main.dart 和 right_back_demo.dart 代码如下:

main.dart文件代码
import 'package:flutter/material.dart';
import 'right_back_demo.dart';

void main()=>runApp(MyApp());

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title:'Flutter Demo',
      theme:ThemeData(primarySwatch: Colors.blue),
      home: RightBackDemo(),
    );
  }
}
right_back_demo。dart文件
import 'package:flutter/cupertino.dart';


class RightBackDemo extends StatelessWidget {
  const RightBackDemo({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(    // 脚手架控件  和material的scaffold不同 没有body部分
        child: Center(    // 直接使用子元素 子控件
          child: Container(   // 盒子容器
            height: 100.0,
            width: 100.0,
            color: CupertinoColors.activeBlue,
            child: CupertinoButton(   // 按钮 添加按钮
              child: Icon(CupertinoIcons.add), 
              onPressed: () {          // 点击 触发事件
                Navigator.of(context).push(      //  路由 打开子页面   路由跳转,打开一个新的页面
                          //  实现右滑返回上一层的关键就是使用CupertinoPageRoute 控件
                  CupertinoPageRoute(builder: ((context) {
                    return RightBackDemo();     // 返回 还是打开这个控件,就是控件打开控件,无限循环
                  }))
                );
              },
            ),
          ),
        )
    );
  }
}

其实只要使用CupertinoPageRoute打开的子页面,就可以实现右滑返回上一级。希望小伙伴们有所收获。那有新的小案例,小伙伴们也可以留言分享哦!

ToolTip控件实例

轻提示的效果在应用中是少不了的,其实Flutter已经准备好了轻提示控件,这就是toolTip。

轻量级操作提示

其实Flutter中有很多提示控件,比如Dialog、Snackbar和BottomSheet这些操作都是比较重量级的,存在屏幕上的时间较长。根据需求的不同,要有多种选择,所以有轻量级操作提示Tooltip

Tooltip是继承于StatefulWidget的一个Widget,它并不需要调出方法,当用户长按被Tooltip包裹的Widget时,会自动弹出相应的操作提示。

main.dart文件

这节课就用最简单代码给大家做一个轻量级提示案例出来。入口文件代码如下:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primaryColor: Colors.blue),
      home: ToolTipDemo(),

    );
  }
}
tool_tips_demo.dart文件

这个文件主要的用途就是承载轻提示控件,代码如下:

import 'package:flutter/material.dart';


class ToolTipDemo extends StatelessWidget {
  const ToolTipDemo({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Tool tips demo')),
      body: Center(
        child: Tooltip(     //  轻量级控件  里面包裹一个控件,包裹什么,就长按什么,就会出现轻量级提示
          message: '易烊千玺  送你一朵小红花',      //  小提示   长按之后出现的提示
          child: Image.network("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg9.51tietu.net%2Fpic%2F2019-091408%2Fdnb0nt4ge0tdnb0nt4ge0t.jpg&refer=http%3A%2F%2Fimg9.51tietu.net&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1666516445&t=2a734397b2d3e9126bbaae27ff025715"),
        ),
      ),
    );
  }
}

效果如下:
易烊千玺

Draggable控件实例

Flutter提供了强大的拖拽控件,可以灵活定制,接下来就是拖拽小案例。
算是一个Flutter进阶,是入门和实战的一个桥梁,相信小伙伴们一定是有所收获的。

Draggable Widget

Draggable控件负责就是拖拽,父层使用了Draggable,它的子元素就是可以拖动的,子元素可以是容器,可以是图片。用起来非常的灵活。

参数说明:

data: 是要传递的参数,在DragTarget里,会接受到这个参数。当然要在拖拽控件推拽到DragTarget的时候。
child:在这里放置你要推拽的元素,可以是容器,也可以是图片和文字。
feedback: 常用于设置推拽元素时的样子,在案例中当推拽的时候,我们把它的颜色透明度变成了50%。当然你还可以改变它的大小。
onDraggableCanceled:是当松开时的相应事件,经常用来改变推拽时到达的位置,改变时用setState来进行。
代码:

Draggable(    // 可拖拽 控件
        // data 就是要传递到下面 接收器 传递给接收器的数据  要传递什么都要写在data参数里
        data: widget.widgetColor,
        child: Container(
          width: 100.0,
          height: 100.0,
          color: widget.widgetColor,
        ),
            //  feedback 可拖动控件  拖动控件拖动时子控件的样子
        feedback: Container(   // 还要传一个 container 不能变
          width: 110,     // 重新定一下容器  重新定义大小
          height: 110,
          color: widget.widgetColor.withOpacity(0.5),
        ),
        //  不拖拽 松手时,里面调用一个匿名函数       也可以简写  velocity  offset
        onDraggableCanceled: (Velocity velocity, Offset offset) {
          // 拖拽完成后,改变位置
          setState(() {
            this.offset = offset;  // offset 重新赋值下
          });
        },
      ),
DragTarget Widget

DragTarget是用来接收拖拽事件的控件,当把Draggable放到DragTarget里时,他会接收Draggable传递过来的值,然后用生成器改变组件状态。

onAccept:当拖拽到控件里时触发,经常在这里得到传递过来的值。
builder: 构造器,里边进行修改child值。

DragTarget(
              //  相当于触发事件  接收color
              onAccept: (Color color){
                _draggablecolor = color;             // 改变color 变成 传递的color
              },
              //  第二个参数 构造器  改变真实的样子 重新返回 container
              builder: (context, candidateData, rejectedData) {
                return Container(     //  接收器也是Container
                  width: 200,            // 重新定义接收器容器
                  height: 200,
                  color: _draggablecolor,
                );
              },
            ),
实例代码DEMO
main.dart 文件:
import 'package:flutter/material.dart';
import 'draggable_demo.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primaryColor: Colors.blue),
      home: DraggableDemo(),

    );
  }
}
draggable_demo.dart 文件
import 'package:flutter/material.dart';

import 'draggable_widget.dart'; //  引入自定义控件 文件

// 继承动态控件
class DraggableDemo extends StatefulWidget {
  const DraggableDemo({Key? key}) : super(key: key);

  
  State<DraggableDemo> createState() => _DraggableDemoState();
}

class _DraggableDemoState extends State<DraggableDemo> {
  // 最后要把 color赋给接收容器里面 所以重新定义 定义用 late  内部使用 所以加 下划线
  late Color _draggablecolor = Colors.grey; // 先给它一个默认颜色 然后再赋值其他颜色

  
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        //  可层叠 控件
        children: [
          DraggableWidget(           //  自定义控件  默认两个参数
            offset: Offset(80.0,80.0), 
            widgetColor: Colors.tealAccent
          ),
          DraggableWidget(
            offset: Offset(180.0,80.0),   // 并排 X轴 距离左边的距离 Y轴 距离上边的距离
            widgetColor: Colors.redAccent,
          ),
          //  第三个 放在中间 就是拖拽接收器
          Center(
            child: DragTarget(
              //  相当于触发事件  接收color
              onAccept: (Color color){
                _draggablecolor = color;             // 改变color 变成 传递的color
              },
              //  第二个参数 构造器  改变真实的样子 重新返回 container
              builder: (context, candidateData, rejectedData) {
                return Container(     //  接收器也是Container
                  width: 200,            // 重新定义接收器容器
                  height: 200,
                  color: _draggablecolor,
                );
              },
            ),
          )
        ],
      ),
    );
  }
}

draggable_widget.dart 文件
import 'package:flutter/material.dart';



class DraggableWidget<double> extends StatefulWidget {

      // final  是变量  const 是常量
      
      // 先声明两个变量 位置  颜色
  final Offset offset;
  final Color widgetColor;
      //  要接受两个参数 , 接收参数就是重写构造方法                   //  调用父类的方法,因为它无名无参
  const DraggableWidget({Key? key,required this.offset,required this.widgetColor}) : super(key: key);

  
  State<DraggableWidget> createState() => _DraggableWidgetState();
}

class _DraggableWidgetState extends State<DraggableWidget> {
  //  声明   位置   0.0  左上角
  Offset offset = Offset(0.0, 0.0);

  //  初始值 
  
  void initState() {
    // TODO: implement initState
    super.initState();
    offset = widget.offset;  // 取控件传递过来的位置
  }

  
  Widget build(BuildContext context) {
    return Positioned(       // 位置颜色不同, 就直接用positioned 控件 直接定义位置
      left: offset.dx,             // left  就是距离左边的边距  offset 就是初始化的 传过来的X轴值
      top: offset.dy,
      child: Draggable(    // 可拖拽 控件
      // data 就是要传递到下面 接收器 传递给接收器的数据  要传递什么都要写在data参数里
        data: widget.widgetColor,
        child: Container(
          width: 100.0,
          height: 100.0,
          color: widget.widgetColor,
        ),
            //  feedback 可拖动控件  拖动控件拖动时子控件的样子
        feedback: Container(   // 还要传一个 container 不能变
          width: 110,     // 重新定一下容器  重新定义大小
          height: 110,
          color: widget.widgetColor.withOpacity(0.5),
        ),
        //  不拖拽 松手时,里面调用一个匿名函数   也可以简写  velocity  offset
        onDraggableCanceled: (Velocity velocity, Offset offset) {
          // 拖拽完成后,改变位置
          setState(() {
            this.offset = offset;  // offset 重新赋值下
          });
        },
      ),
    );
  }
}

效果如图:
拖拽
拖拽

这样就完成了拖拽小案例,希望小伙伴们有更多小案例一起留言分享哦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值