Flutter开发日志——Dart篇

前言

终有一天,学习变得很慢,坚持变得很难。希望心底的那团火能让你浴火重生。觉醒吧,不屈的少年!前面星辰大海,前面是诗和远方!

环境

Dart因Flutter而生,自然也伴随Flutter一路。安装好Flutter环境后,便可开始学习Dart之旅。

// ethan@B85MK:~/Flutter/Dart$ cat hello_world.dart 
var name = 'I am nobody.';
void main() {
    print('Hello,World!');
    print( name );
}
ethan@B85MK:~/Flutter/Dart$ dart run hello_world.dart 
Hello,World!
I am nobody.

杂记

shorthand arrow

举例

int sum_traditional(int x, int y) {
  return x + y;
}

int sum_shorthand_arrow(int x, int y) => x + y;

void main() {
    print('traditional : 1 + 1 = ' + sum_traditional(1, 1).toString());
    print('arrow       : 1 + 1 = ' + sum_shorthand_arrow(1, 1).toString());
}

输出

traditional : 1 + 1 = 2
arrow       : 1 + 1 = 2

Nullable

举例

void main() {
    int a = null;

    print(a);
}

输出

ethan@B85MK:~/Flutter/Dart$ dart run nullable.dart 
nullable.dart:2:13: Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable.
    int a = null;
            ^

讲解

null跟C语言的含义并不一样。在C语言,null是一个常量,其值等于0。而Dart语言是空,表示该变量不分配内存。上述例子,int a表示创建变量a,并分配内存。再取消分配内存,是不允许的。如果需要赋值null,请用int? a创建。

举例

ethan@B85MK:~/Flutter/Dart$ cat -n nullaware.dart 
     1	void main() {
     2	    int? a;     // = null
     3	    a ??= 3;
     4	    print(a);   // <-- Prints 3.
     5	
     6	    a ??= 5;
     7	    print(a);   // <-- Still prints 3.
     8	}

输出

nullaware.dart:6:5: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
    a ??= 5;
    ^
3
3

讲解

解释一下这个Warning。该代码第3行明显赋值了。故而,第6行再测试是否为空再赋值变得多余。编译器会认为该操作可能不符合程序员的预期,所以警告。

Exceptions

举例

void main() {
    final numbers = <int>[2, 2, 7, 10];

    try {
        try {
            var result = numbers.singleWhere((element) => element > 5);
            print(result);
        } on StateError catch (e) {
            print("StateError found!");
            rethrow;
        } finally {
            print("End0");
        }
    } catch (e) {
        print(e);
    } finally {
        print("End1");
    }
}

输出

$ dart run single_where.dart 
StateError found!
End0
Bad state: Too many elements
End1

解释

singleWhere方法在遇到符合条件的元素超过1个或者没有的情况下会抛出错误StateError。同时,这里展示了rethrow的使用。

Class

举例

Iterable<User> filterOutUnder40(Iterable<User> users) {
    return users.where((user) => user.age < 40);
}

Iterable<User> findShortNamed(Iterable<User> users) {
    return users.where((user) => user.name.length <= 7);
}

class User {
    String name;
    int age;

    User(
            this.name,
            this.age,
        );
}

void main() {
    Iterable<User> users = [
        User("EthanChou", 33),
        User("JackyHe", 41),
        User("EllenSheng", 38)
    ];

    print("Users under 40");
    var usersUnder40 = filterOutUnder40(users);
    for (final element in usersUnder40 ) {
        print(element.name);
    }

    print("");
    print("Users with short name");
    var usersWithShortName = findShortNamed(users);
    for (final element in usersWithShortName) {
        print(element.name);
    }
}

讲解
此代码是dart.dev网站一道练习题的答案。对于基础比较低笔者来说,还是比较有挑战性的。

  • Iterable<User>的初始化
  • filterOutUnder40findShortNamed是两个函数。

async

举例

Future<void> printOrderMessage() async {
  print('Awaiting user order...');
  var order = await fetchUserOrder();
  print('Your order is: $order');
}

Future<String> fetchUserOrder() {
  // Imagine that this function is more complex and slow.
  return Future.delayed(const Duration(seconds: 4), () => 'Large Latte');
}

void main() async {
  countSeconds(4);
  await printOrderMessage();
}

// You can ignore this function - it's here to visualize delay time in this example.
void countSeconds(int s) {
  for (var i = 1; i <= s; i++) {
    Future.delayed(Duration(seconds: i), () => print(i));
  }
}

输出

$ dart run future_async.dart 
Awaiting user order...
1
2
3
4
Your order is: Large Latte

解释

网文说,Dart是一个单线程模型。异步机制替代多线程,简化多线程编程。上述代码中,Future是SDK封装的类。await会等待异步代码完成,从而异步变同步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值