前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flutter中的操作提示

Flutter中的操作提示

作者头像
flyou
发布于 2019-08-06 09:07:41
发布于 2019-08-06 09:07:41
2.2K00
代码可运行
举报
文章被收录于专栏:flutter开发者flutter开发者
运行总次数:0
代码可运行

在前面的文章中我们学习了Flutter中输入以及选择控件的用法,借助于这些组件大家可以完成很多常用的功能,但是他不能及时在用户操作后完成相应的界面提示,所以今天我们就会来看下Flutter中的操作提示。

但是在开始今天的内容之前,我们还是需要把昨天留下的问题解决下。

在上篇文章中我们介绍了CheckBoxListTitle的用法,关于RadioListTitle和SwitchListTitle的用法法并没有介绍,因为真的很简单,所以还是直接看下下面的代码吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  var _isChecked = true;

  onCheckChange(bool isChecked) {
    setState(() {
      _isChecked = isChecked;
    });
  }

  int radioValue = 0;

  void onRadioValueChanged(int value) {
    setState(() {
      radioValue = value;
    });
  }

  var isSwitch = true;

  onSwitchChange(bool isChecked) {
    setState(() {
      isSwitch = isChecked;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(title: new Text("Test")),
      body: new Column(
        children: <Widget>[
          new CheckboxListTile(
            value: _isChecked,
            onChanged: onCheckChange,
            secondary: new Icon(
              Icons.update,
              color: Colors.blueAccent,
            ),
            title: new Text("新版本自动下载"),
            subtitle: new Text("仅在WiFi环境下生效"),
          ),
          new Divider(
            height: 1.0,
            color: Colors.grey,
          ),
          new RadioListTile(
            value: 0,
            groupValue: radioValue,
            controlAffinity: ListTileControlAffinity.trailing,
            onChanged: onRadioValueChanged,
            title: new Text("定时提醒间隔"),
            subtitle: new Text("10分钟"),
            secondary: new Icon(
              Icons.timer,
              color: Colors.blueAccent,
            ),
          ),
          new RadioListTile(
            value: 1,
            groupValue: radioValue,
            controlAffinity: ListTileControlAffinity.trailing,
            onChanged: onRadioValueChanged,
            title: new Text("定时提醒间隔"),
            subtitle: new Text("30分钟"),
            secondary: new Icon(
              Icons.timer,
              color: Colors.blueAccent,
            ),
          ),
          new RadioListTile(
            value: 2,
            groupValue: radioValue,
            controlAffinity: ListTileControlAffinity.trailing,
            onChanged: onRadioValueChanged,
            title: new Text("定时提醒间隔"),
            subtitle: new Text("1个小时"),
            secondary: new Icon(
              Icons.timer,
              color: Colors.blueAccent,
            ),
          ),
          new Divider(
            height: 1.0,
            color: Colors.grey,
          ),
          new SwitchListTile(
            value: isSwitch,
            onChanged: onSwitchChange,
            title: new Text("新消息提醒"),
            secondary: new Icon(
              Icons.message,
              color: Colors.blueAccent,
            ),
          )
        ],
      ),
    );
  }
}

在文章中我们提到了Divider这个Widget,看名字就知道是分割线的意思,构造方法也仅有两个参数,一个是分割线你的高度,一个是分割线的颜色。

在原生客户端有着几种常用的用户提醒方式,如Dialog、Snackbar、BottomSheet等,今天我们就来介绍下Flutter中几种常用的提醒方式。

Snackbar


底部快捷提示和Android中的可以说是相似度很高的,用法也很简单。

构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const SnackBar({
Key key,
@required this.content,//内容
this.backgroundColor,//背景
this.action,//其他操作
this.duration: _kSnackBarDisplayDuration,//显示时长
this.animation,//进出动画
})

够造方法很简单,只不过action参数需要说明下,action就是可以在SnackBar的右侧显示的Widget(按钮、文字等),点击这个Widget可以触发相应的操作,如常见的 撤回 操作。

虽然构造方法很简单,但是我们并不能直接显示SnackBar,我们可以借助于

Scaffold.of(context).showSnackBar()来显示一个SnackBar,值得注意的是这个context必须不能是Scaffold节点下的context,因为Scaffold.of()方法需要从Widget树中去找到Scaffold的Context,所以如果直接在Scaffold中使用showSnackBar,需要在外城包括上Builder Widget,这个Builder不做任何的其他操作,只不过把Widget树往下移了一层而已。

下面还是来看下代码吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
      home: new MaterialApp(
        home: new MyApp(),
      )));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("SnackBar"),
        ),
        body: new Center(
          child: new Builder(builder: (BuildContext context) {
            return new RaisedButton(
              onPressed: () {
                Scaffold.of(context).showSnackBar(new SnackBar(
                  content: new Text("Snackbar"),
                  action: new SnackBarAction(
                    label: "撤回",
                    onPressed: () {},
                  ),
                ));
              },
              child: new Text("点我啊"),
              color: Colors.blue,
              highlightColor: Colors.lightBlueAccent,
              disabledColor: Colors.lightBlueAccent,
            );
          }),
        ));
  }
}

我们在屏幕的正中央定义了一个RaisedButton,没当我们点击RaisedButton就会触发onPress的的回调,弹出SnackBar。 action参数中我们传入了一个SnackBarAction对象,lable我们设置为“撤回”,点击事件我们先不做处理。

Dialog


对话框在Ios和Android客户端中都很常见,在Flutter中常用的AlertDialog、SimpleDialog和AboutDialog。

今天我们就来介绍下这几种Dialog的用法 。 在Flutter中你可以使用ShowDialog方法来显示这些Dialog。 showDialog方法需要传入一个上下文对象和一个Widget对象

SimpleDialog

就是最简单的对话框,当然也是最灵活的对话框,对话框显示区域完全由你自己自定义,你可以根据自己的需要绘制自己想要的界面。

还是来看下构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const SimpleDialog({
Key key,
this.title,//标题
this.titlePadding,标题padding
this.children,//内容
this.contentPadding,内容padding
})

好吧,构造方法一如既往的简单,我们只需要传入title和内容就可以完成一个最简单的Dialog,好吧还是来试一下吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(home: new MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Dialog"),
        ),
        body: new Center(
          child: new Builder(builder: (BuildContext context) {
            return new RaisedButton(
                onPressed: () {
                  showDialog(
                      context: context,
                      child: new SimpleDialog(
                        contentPadding: const EdgeInsets.all(10.0),
                        title: new Text("我是标题"),
                        children: <Widget>[
                          new Text("我是内容区域,
            哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈啊哈哈哈")
                        ],
                      ));
                },
                child: new Text("Dialog出来"),
                color: Colors.blue,
                highlightColor: Colors.lightBlueAccent,
                disabledColor: Colors.lightBlueAccent);
          }),
        ));
  }
}

这样一来我们就把这个DIalog给显示出来了,在构造方法中我们可以看出需要传入的是children对象,也就是你可以根据自己的需要传入多个Widget对象。

好吧我们改变下 的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
children: <Widget>[
new ListTile(
leading: new Icon(Icons.apps),
title: new Text("apps"),),

new ListTile(
leading: new Icon(Icons.android),
title: new Text("andrpid"),),

new ListTile(
leading: new Icon(Icons.cake),
title: new Text("cake"),),

new ListTile(
leading: new Icon(Icons.local_cafe),
title: new Text("cofe"),),
]

再来看下效果:

好了,其他的效果还是需要大家自己去实现的。

AlertDialog

AlertDialog其实就是simpleDialog的封装,更加方便开发者使用,只不过在simpeDialog的基础上新增了action操作而已

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(home: new MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Dialog"),
        ),
        body: new Center(
          child: new Builder(builder: (BuildContext context) {
            return new RaisedButton(
                onPressed: () {
                  showDialog(
                      context: context,
                      child: new AlertDialog(
                        content: new Text("我是AlertDialog"),
                        actions: <Widget>[
                          new FlatButton(
                              onPressed: () {
                                Navigator.pop(context);
                              },
                              child: new Text('确定'))
                        ],
                      ));
                },
                child: new Text("Dialog出来"),
                color: Colors.blue,
                highlightColor: Colors.lightBlueAccent,
                disabledColor: Colors.lightBlueAccent);
          }),
        ));
  }
}

这样就直接可以显示一个最简单的AlertDialog,每当点击确认按钮既可以完成相应的操作,这里我们仅仅是关闭掉了Dialog而已。

AboutDialog

AboutDialog也是在SimpleDialog基础上的封装,可以很方便的显示关于应用的Dialog。由于跟上面的用法类似,这里就不在介绍它的够造方法了。

在上面代码的基础上,我们把上述代码中onPressed方法里的内容替换为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
onPressed: () {
showDialog(
context: context,
child: new AboutDialog(
applicationName: "最佳助手:",
applicationVersion: "V1.0",
applicationIcon: new Icon(Icons.android,color: Colors.blueAccent,),
children: <Widget>[new Text("更新摘要\n新增飞天遁地功能\n优化用户体验")],
));
}

每当我们点击屏幕中心按钮则会弹出如下AboutDialog,点击viewLicenes即可进入到查看License界面。

好吧,也很简单,我们接下来看下BottomSheet

BottomSheet

也被称为底部菜单,通常情况下分享操作界面使用的比较多。

如果要显示BottomSheet我们可以调用,showBottomSheet()或者showModalBottomSheet()方法。这两种方法都可以显示BottomSheet,只不过第一个是从新打开了一个界面来显示,第二个方法是直接在当前界面的下面来显示。

两个方法都需要传入一个Context和一个WidgetBuilder

我们还是来看下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(home: new MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("BottomSheet"),
        ),
        body: new Center(
          child: new Builder(builder: (BuildContext context) {
            return new RaisedButton(
                onPressed: () {

                  showBottomSheet(
                      context: context,
                      builder: (BuildContext context) {
                        return new Container(
                            child: new Padding(
                                padding: const EdgeInsets.all(10.0),
                                child: new Column(
                                  children: <Widget>[
                                    new ListTile(
                                      leading: new Icon(Icons.chat),
                                      title: new Text("开始会话"),
                                    ),
                                    new ListTile(
                                      leading: new Icon(Icons.help),
                                      title: new Text("操作说明"),
                                    ),
                                    new ListTile(
                                      leading: new Icon(Icons.settings),
                                      title: new Text("系统设置"),
                                    ),
                                    new ListTile(
                                      leading: new Icon(Icons.more),
                                      title: new Text("更多设置"),
                                    ),
                                  ],
                                ))
                        );
                      });
                },
                child: new Text("Dialog出来"),
                color: Colors.blue,
                highlightColor: Colors.lightBlueAccent,
                disabledColor: Colors.lightBlueAccent);
          }),
        ));
  }
}

现在我们仅仅把方法名改为showModalBottomSheet再来看下

当然,大家可以根据自己的需要设置相应的内容和点击事件来满足相应的需求。

小结


  • SnackBar可以快捷的在底部显示提示Tips
  • 使用showAlert方法可以显示SimpleDialog、AlertDialog和AboutDialog
  • 使用BottomSheet可以实现底部抽屉的效果

我怀疑这个是个坏掉的二维码,分享到朋友圈试试?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 flutter开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
19.Flutter学习之路Dialog种类
class DialogPage extends StatefulWidget { @override State<StatefulWidget> createState() { return _DialogPageState(); } } class _DialogPageState extends State<DialogPage> { _alertDialog() async { var result = await showDialog( conte
易帜
2022/02/09
3100
19.Flutter学习之路Dialog种类
自定义 Flutter 中的 Drawer
当我们创建移动端应用的时候,有两种主要的导航选项:Tabs 和 Drawers。当没有足够的空间来展示 Tabs,那么 Drawers 提供了个不错的选择。
Jimmy_is_jimmy
2024/05/17
2750
自定义 Flutter 中的 Drawer
【Flutter 15】图解 ListView 不同样式 item 及 Widget 显隐性
一年一度的谷歌大会又开始了,谷歌对 Flutter 的投入力度又加大了,所以更得好好学 Flutter 了。和尚在做新闻列表方面的 Demo 时,想到会在列表中展示多种不同 item 样式,今天特意借助上一篇关于 ListView 的小例子 稍微调整一下,测试 ListView 中多种 item 样式展示方式。
阿策小和尚
2019/08/12
2.8K0
【Flutter 15】图解 ListView 不同样式 item 及 Widget 显隐性
[Flutter Widget]Tooltip
在前面的文章中我们讲到了Wrap的用法,介绍了Flutter中的流式布局,在文章的最后让大家实现如下效果:
flyou
2018/10/16
3.2K0
Flutter 构建一个 todo list 应用
这个 TodoApp 应该是一个 statelessWidget。这将会是我们列表的骨架
Jimmy_is_jimmy
2022/10/05
1.4K0
Flutter 构建一个 todo list 应用
你知道吗,Flutter内置了10多种show
builder通常返回Dialog组件,比如SimpleDialog和AlertDialog。
老孟Flutter
2020/03/19
2K0
Flutter | 常用组件分类、概述、实战
AppBar(title属性,Text组件; action:动作响应;!!!! titleSpacing:标题文字间距; toolbarOpacity:标题透明度;)
凌川江雪
2020/06/16
4.4K0
【Flutter 专题】60 图解基本 Dialog 对话框小结
Dialog 在日常开发中应用广泛,大家也对此很熟悉;和尚以前也整理过关于自定义 Dialog 的小博客,今天和尚系统的学习一下最基本的 Dialog;
阿策小和尚
2019/09/17
3.4K0
【Flutter 专题】60 图解基本 Dialog 对话框小结
Flutter中的路由与跳转
在前一篇的文章我们学习了ListView和GridView的用法,我们可以使用new 方式和ListView.builder()、ListView.custom()的方式来构建这两个Widget,使用ListVIew和GridView可以帮助我们快速构建多Item视图。
flyou
2019/08/06
1.6K0
Flutter中的路由与跳转
Flutter | 使用 InkResponse和 InkWell组件 实现事件操作
InkResponse 和 InkWell 内部使用了Ink; 可以包裹 不具备事件处理的组件,实现水波纹等点击事件的效果; InkWell 水波纹限制在文本组件之内; InkResponse 水波
凌川江雪
2020/07/07
2K0
Flutter 入门指北之弹窗和提示(干货)
例如我们需要实现一个功能,修改某个值,修改后给用户一个提示,同时给用户一个撤销该操作的按钮,那么就可以通过 SnackBar 来简单实现。还有就是 SnackBar 可以和 floatingActionButton 完美的配合,弹出的时候不会遮挡住 fab
陈宇明
2020/12/16
2.4K0
Flutter入门(五)
国际化方案http://bbs.itying.com/topic/5cfb2a12f322340b2c90e764
用户3112896
2019/12/30
9780
Flutter 页面交互 | 路由跳转方式、常用API、发送接收数据、可能发生的问题与知识点拓展
【pushAndRemoveUntil与pushNamedAndRemoveUntil区别】
凌川江雪
2020/06/29
4K0
Flutter 页面交互 | 路由跳转方式、常用API、发送接收数据、可能发生的问题与知识点拓展
[- Flutter基础篇 -] 聊聊那些弹框
对话框作为一个挺重要的东西,这里来说一下,细细一数也蛮多的,本文包括 [1].SimpleDialog [2].AlertDialog [3].CupertinoAlertDialog [4].Dialog中的组件状态更新 [5].SnackBar [6].BottomSheet [7].DatePicker [8].TimePickerwTimePicker, [9].CupertinoPicker [10].CupertinoDatePicker [11].CupertinoTimerPicker
张风捷特烈
2020/04/30
2K0
[- Flutter基础篇 -] 聊聊那些弹框
Flutter 滑动删除最佳实践
现在我们只需要理解,key 是 widget 的唯一标示。因为有了key,所以 widget tree 才知道我们删除了什么widget。
Flutter笔记
2019/07/24
2.2K0
Flutter 滑动删除最佳实践
ListView&GirdView
在前面的的文章中我们了解了Flutter中操作提示的用法,包括SnackBar、Dialog、以及BottomSheet,通过这些Widget我们可以很方便的实现对应用操作的提示。
flyou
2019/08/06
1.8K0
ListView&GirdView
Flutter入门指南
笔者项目中使用Flutter的模块并不多。虽然笔者还没有机会在项目中正式使用Flutter,但是也在学习Flutter的一些基本用法。本文就是一篇Flutter的入门介绍,后续会写更多深入介绍的文章。Flutter可以通过一套代码库快速构建高质量、高性能的跨平台应用,支持iOS、Android、Web以及桌面平台。在本文中,我们将介绍如何入门Flutter,包括环境搭建、基本概念、常用组件以及示例代码。
陆业聪
2024/07/23
2280
Flutter入门指南
Flutter容器类组件
⚠️注意, Flutter官方并没有对Widget进行如此划分。中文版《Flutter实战》对其分类主要是方便讨论和对Widget功能区分记忆。
白白白小艾
2022/03/24
4K0
Flutter 布局备忘录 -- 多图警告,干货建议收藏
这里我将展示我在使用 Flutter 布局的代码片段。我将通过精美的代码片段结合可视化的图形来举例。
Jimmy_is_jimmy
2022/08/30
2.9K0
Flutter 布局备忘录 -- 多图警告,干货建议收藏
Flutter 1.17 新 Material motion 规范的预构建动画
软件包 pub 地址:https://pub.dev/packages/animations
老孟Flutter
2020/09/11
1.2K0
Flutter 1.17 新 Material motion 规范的预构建动画
相关推荐
19.Flutter学习之路Dialog种类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验