一统天下 flutter - dart: 控制语句(if/else, switch/case, while/do-while, for)

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - dart: 控制语句(if/else, switch/case, while/do-while, for)

示例如下:

lib\dart\statement.dart

/*
 * dart 控制语句(if/else, switch/case, while/do-while, for)
 */

import 'package:flutter/material.dart';
import 'package:flutter_demo/helper.dart';

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

  @override
  Widget build(BuildContext context) {

    // if/else
    sample1();
    // switch/case
    sample2();
    // while/do-while
    sample3();
    // for/forEach
    sample4();

    return Column(
      children: [
        // for 语句可以用来生成 widget 集合
        for (var i = 0; i < 10; i++)
          MyText('text $i')
      ],
    );
  }

  void sample1() {
    var a = 1;
    if (a > 1) {
      log("a > 1");
    } else if (a < 1) {
      log("a < 1");
    } else {
      log("a == 1");
    }

    Object b = "webabcd";
    // 判断类型成功之后,再使用时其就是被转换之后的
    if (b is String) {
      log("${b.length}");
    }
    // 判断类型成功之后,再使用时其就是被转换之后的
    if (b is String && b.length == 7) {
      log("ok");
    }

    String? c = currentTimestamp() % 999999 == 0 ? null : "webabcd";
    // 判断为非空之后,再使用时其就是非空了
    if (c != null) {
      log("${c.length}");
    }
    // 判断为非空之后,再使用时其就是非空了
    if (c != null && c.length == 7) {
      log("ok");
    }
  }

  void sample2() {
    var a = 1;
    switch (a) {
      case 1:
        log("a == 1");
        break; // 没有 break 的话会编译时报错
      default:
        log("a != 1");
    }

    var b = 0;
    switch (b) {
      case 0: // 空 case 语句允许没有 break,结果就是强制执行下一个 case 语句中的表达式(不管下一个 case 语句的条件是否匹配),这种行为称之为 fall-through
      case 1:
        log("b == 1");
        break;
      default:
        log("b != 1");
    }
    // 上面的执行结果为:
    // b == 1

    var c = 0;
    switch (c) {
      case 0:
        log("c == 0");
        continue myLabel; // 如果需要自行控制 fall-through 则可以通过 continue 跳转到指定的位置
      case 1:
        log("c == 1");
        break;
      myLabel:
      case 2:
        log("c == 2");
        break;
      default:
        log("c != 1");
    }
    // 上面的执行结果为:
    // c == 0
    // c == 2
  }

  void sample3() {
    int a = 1;
    // while 循环(支持 break 和 continue)
    while (a < 3) {
      log("a: $a");
      a++;
    }

    int b = 1;
    // do-while 循环(支持 break 和 continue)
    do {
      log("b: $b");
      b++;
    } while (b < 3);
  }

  void sample4() {
    var a = [1, 2, 3];
    // for 循环(支持 break 和 continue)
    for (var i = 0; i < a.length; i++) {
      log("a:${a[i]}");
    }

    var b = 0;
    // for 循环(括号中的各种表达式不需要的话可以省略)
    for (;;) {
      if (b >= a.length) {
        break;
      }
      log("a:${a[b]}");
      b++;
    }

    // for 循环(foreach 的方式)
    for (var item in a) {
      log("a:$item");
    }

    // 可迭代对象的 forEach 方法
    // 迭代出的元素是 int 类型,每迭代一次就调用一次 myLog(int i) 方法,并为其传递迭代出的数据
    a.forEach(myLog); // 注:不建议在 forEach 中使用匿名函数,比如像这样写 a.forEach((i) { log("$i"); }); 是不被推荐的
  }
  void myLog(int i) {
    log("$i");
  }
}

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

posted @ 2023-03-22 09:27  webabcd  阅读(235)  评论(0编辑  收藏  举报