Flutter与一些常用的Dart语法

前言

上一次写了flutter相关的文章还是在7月份,如今都flutter2.5正式版了,官网都焕然一新了。

图片

于是乎,不要等了是时候学习了,开始记录下flutter开发过程中dart的一些常用语法,可以帮助我们事半功倍。

关于Dart

Dart 是一门为全平台构建快速应用的客户端优化的编程语言,它的优点如下:

  • 为 UI 构建:优化使用针对用户界面的创造进行优化的语言进行开发

  • 研发生产力提高:可反复地修改,然后在正在运行的应用中使用热重载立刻看到您的修改

  • 在全平台极速运行:可编译为移动端、桌面端及后端的 ARM & x64 的二进制文件,或是为 Web 平台编译 Javascript

接下来主要记录Flutter开发中常用的dart语法,然后如何更方便快捷地实现一些flutter小小的功能。关于更多Dart相关的知识点,这里不会一一赘述,不过我们可以到官网系统性地学习Dart语言,这也是Flutter开发的必备语言,官方地址如下:Dart:https://dart.cn/

List数组的常用方法

数组 (Array) 是几乎所有编程语言中最常见的集合类型,在 Dart 中数组由 List 对象表示。接下来运用使用dart工具来运行这些常用的方法,工具:https://dartpad.cn

  • 定义固定长度数组
void main() {  var list = List(2);  print('$list'); // [null, null]}
  • 定义混合类型数组
void main() { 
 var list = List<dynamic>();
  list.add('我是文本');
  list.add(0.66); 
 print(list); // [我是文本, 0.66]}
  • 获取数组第一个元素
void main() { 
 var list = [1, 2, 2, 3, 4, 5, 6, 6]; 
 print(list.first); // 1
}
  • 获取数组最后一个元素
void main() { 
 var list = [1, 2, 2, 3, 4, 5, 6, 6]; 
 print(list.last); // 6
}
  • 获取倒序迭代器 - reversed
void main() { 
   var list = [1, 2, 2, 3, 4, 5, 6, 6];  
  print(list.reversed); // (6, 6, 5, 4, 3, 2, 2, 1)
}
  • 批量添加 - addAll或者 扩展操作符(...)和 空感知扩展操作符(...?)
void main() { 
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
  var list2 = [0, 20, 40];
  list.addAll(list2);
  print(list); //[1, 2, 2, 3, 4, 5, 6, 6, 0, 20, 40]
}

或使用扩展操作符,结果是一样的

void main() {
  var list2 = [0, 20, 40];
  var list = [1, 2, 2, 3, 4, 5, 6, 6, ...?list2];
  print(list); //[1, 2, 2, 3, 4, 5, 6, 6, 0, 20, 40]
}
  • 判断数组内是否有满足条件的元素- any
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];// 数组中是否有大于3的元素
  print(list.any((v) => v > 3)); // true
// 数组中是否有大于7的元素
  print(list.any((v) => v > 7)); // false
}
  • 判断数组所有元素是否都满足设定条件 - every
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
// 数组中所有元素是否都大于0
  print(list.every((v) => v > 0)); // true
// 数组中所有元素是否都大于5
  print(list.every((v) => v > 5)); // false
}
  • 获取满足条件的元素 - where
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
  // 获取所有大于3的元素
  print(list.where((v) => v > 3).toList()); //[4, 5, 6, 6]
}
  • 获取满足条件的第一个元素 - firstWhere
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];  // 获取最后一个大于3的元素
  print(list.firstWhere((v) => v > 3)); // 4
  // 如果未查找到所制定条件的元素,进入orElse参数 
 list.firstWhere((v) => v > 6, orElse: () {
    print(888);
  });
}

获取满足条件的最后一个元素 - lastWhere (与firstWhere同理,第一个与最后一个的区别)

  • 从指定位置开始,获取满足条件的第一个元素的索引 - indexWhere
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
  // 查询第一个大于3的元素索引值
  print(list.indexWhere((v) => v > 3)); // 4
// 从索引3开始,查询第一个大于4的元素索引值
  print(list.indexWhere((v) => v > 4, 3)); // 5
// 从索引3开始,查询第一个大于6的元素索引值
// 若不存在,返回-1
  print(list.indexWhere((v) => v > 6, 3)); // -1
}

获取满足条件的最后一个元素的索引(倒叙查询) - lastIndexWhere(与indexWhere同理,第一个与最后一个的区别)

  • 从指定位置开始,获取指定值的索引 - indexOf
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
  // 从索引6开始,获取5第一次出现时的索引值,如果不存在,返回 -1
  print(list.indexOf(5, 6)); // -1
  print(list.indexOf(5)); // 5
}

从指定位置开始,倒叙获取指定值的索引 - lastIndexOf(与indexOf同理,第一次与最后一次的区别)

  • 将数组用指定字符拼接成字符串 - join
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
  // 将数组转换为用英文逗号拼接的字符串
  print(list.join(',')); // 1,2,2,3,4,5,6,6
}
  • 数组去重 - toSet
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
  print(list.toSet()); // {1, 2, 3, 4, 5, 6}
}
  • 数组遍历 - for\for in\forEach
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6]; 
 //for
  for (var i = 0; i < list.length; i++) {
    print("for:$i");  
}
  //for in
  for (var item in list) {
    print("for in:$item");  
}
  //forEach
  list.forEach((element) {
    print("forEach:$element");
  });
}
  • 按指定条件返回 - map
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];  // 将list所有元素加1并返回数组
  var v = list.map((e) {
    return e + 1;  
}).toList(); 
 print(v); //[2, 3, 3, 4, 5, 6, 7, 7]
}
  • 累加器 - reduce
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];// 将每次返回值作为value循环执行。最终返回最后一次执行值
  var count = list.reduce((value, element) {
    print('value: $value - element: $element');
    /**    每次的执行结果
    value: 1 - element: 2
    value: 3 - element: 2 
   value: 5 - element: 3 
   value: 8 - element: 4 
   value: 12 - element: 5 
   value: 17 - element: 6
    value: 23 - element: 6 
 */ 
   return value + element; 
 }); 
 print('count: $count'); // count: 29
}
  • 排序 - sort
void main() {
  var list = [1, 2, 2, 3, 4, 5, 6, 6];
// a - b 为升序, b - a为降序
  list.sort((a, b) {    return b - a;  });
  print(list); //[6, 6, 5, 4, 3, 2, 2, 1]
}

条件表达式与****i****f语句~在布局中使用

在flutter开发写页面时,经常都会处理一些判断逻辑,比如什么时候显示xxx按钮,什么时候隐藏xxx布局,这里常用的就是条件表达式与if判断语句了。

图片

举个例子,如上图 现在页面上有文本显示和一个button1,我要隐藏页面的button1, 使用条件表达式:

class _MyHomePageState extends State<MyHomePage> {
  bool _showButton1 = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("页面标题"), 
     ),
      body: Column( 
       mainAxisAlignment: MainAxisAlignment.center, 
       children: <Widget>[ 
         Text(
            '我是文本描述', 
         ),
          _showButton1
              ? RaisedButton(
                  onPressed: () {},
                  child: Text("Button1"), 
               ) 
             : SizedBox() 
       ],
      ),
    );
  }}

这里用了条件表达式来判断是否显示Button1,如果不显示Button1就显示SizedBox(),所以这里不管怎么都要显示一个widget,显然不是最好的写法,因此这里改用if语句会更好

class _MyHomePageState extends State<MyHomePage> {
  bool _showButton1 = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("页面标题"),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            '我是文本描述',
          ),
          if (_showButton1) 
           RaisedButton(
              onPressed: () {},
              child: Text("Button1"), 
           ) 
       ], 
     ),
    );
  }}

扩展操作符(...)与List map ****~在布局中使用

在flutter开发写页面时,经常都会处理一些List数组相关的数据,比如现在有一个String数组,里面元素需要作为按钮名称展示出来,这时会有很多写法,其中比较简洁明了的就是扩展操作符与map结合使用:

图片
Widget _body() {
    List<String> buttonNames = [
      "button1",
      "button2",
      "button3", 
     "button4",
    ]; 
   return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            '我是文本描述', 
         ),
          ...?buttonNames 
             .map((name) => RaisedButton(
                    onPressed: () {},
                    child: Text("$name"), 
                 )) 
             .toList()
        ],
      ),
    );
  }

最后还有很多很多等着我去实践去总结的知识点,这篇暂且记录到此,改天再见!

                              --------  END  ---------
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容