美文网首页
flutter一语法入门

flutter一语法入门

作者: crossroads | 来源:发表于2024-03-31 16:49 被阅读0次

前言

所有笔记均来自flutter实战,鉴于有kotlin基础,以kotlin为基准 .
小提示
print打印出的内容,在run命令栏中可以看到,杀死app重新打开在logcat中 筛选 tag:flutter 可看到。

一、基础变量

  1. 一看就懂
    const a = "hello world"; //编译时直接替换为常量值
    final  b = "hello world";  //在第一次使用时被初始化
    int?  c;  //类似kotlin的空安全类型
    late int d;  //类似kotlin的late
     var e;  //只有var没有val
  1. 一个java和kotlin从未有过的类型-动态类型dynamic
    类似object的dynamic 动态类型,即在运行时确定类型。
    和object不同的是dynamic声明的对象编译器会提供所有可能的组合,而Object声明的对象只能使用 Object 的属性与方法, 否则编译器会报错。
object a = "hello world"
 print(a.length); // 报错 The getter 'length' is not defined for the class 'Object'
 dynamic b = "hello world"
  print(b.length);//正常

使用场景:
当无法确认一个变量的数据类型时,可以用,但是性能会有所损失且编译时不会进行类型检查,容易出问题,尽量不要用。

二、函数

  1. 记得写返回值类型哦
bool isNone(int atomicNumber) {//返回值boolean
  return atomicNumber == 0;
}
isNone(int atomicNumber) {//返回值dynamic ,不是boolean
  return atomicNumber == 0;
}
    bool isNone (int atomicNumber) => atomicNumber==0 ;//简易写法
  1. 函数可以是变量,也可以将函数变为参数传递
  void test(var callback) {
    callback();
  }
  //将函数变为参数传递
    test((){
      print("afsf");
    }); 
    test(() => print("hi"));//简易写法

  //变量=函数
   var printstr = (str){
      print(str);
    };
   test(printstr);

   printstr(str){//简易写法
      print(str);
    }
    test(printstr);
  1. 函数的可选参数
  void say(String must, [String? choice,String? defaultvalue ="默认"]) {
    print("$must 和 $choice and $defaultvalue");
  }
  say("必须");// 必须 和 null and 默认
  say("必须","选择了");//必须 和 选择了 and 默认
  say("必须","选择了","都给了");//必须 和 选择了 and 都给了
  1. 上面的可选参数不能像kotlin一样可选命名参数,就是只给defaultvalue赋值,跳过中间的choice ,那如何像kotlin一样呢?
  void say(String must,{String? choice,String? defaultvalue ="默认"}) {
    print("$must 和 $choice and $defaultvalue");
  }

    say("必须");// 必须 和 null and 默认
    say("必须",choice:"选择了");//必须 和 选择了 and 默认
    say("必须",defaultvalue: "都给了");//必须 和 null and 都给了

当然,这里没有kotlin的方便,因为不能同时使用3和4 ,也就是不能同时使用可选的位置参数和可选的命名参数

三、类

  1. 创建对象无需new
class A { A(); }
m(){
  final a = A();
}
  1. 不可不会的mixin,有点像多继承。
mixin Eat{
  eat(){
    print('吃饭');
  }
}

mixin Code{
  eat(){
    print('敲代码');
  }
}

class MyApp extends StatelessWidget with Eat,Code {}

如果多个mixin 中有同名方法,with 时,会默认使用最后面的 mixin 的,mixin 方法中可以通过 super 关键字调用之前 mixin 或类中的方法
四、异步
这部分如果用过rxjava会好理解

  1. Future的基础使用
//等待多个异步任务都执行结束后才进行一些操作的示例
  Future.wait([
      // 2秒后返回结果
      Future.delayed(const Duration(seconds: 2), () {
        return "hello";
      }),
      // 4秒后返回结果
      Future.delayed(const Duration(seconds: 4), () {
        return " world";
      })
    ]).then((results){
      //成功
      print(results[0]+results[1]);
    }).catchError((e){
      //失败
      print(e);
    }).whenComplete(() => {
      //无论成功失败都会走到这里
    });
  1. Future的链式调用,消除回调地狱
//先分别定义各个异步任务
  Future<String> login(String userName) {
    return Future.sync(() => "hello");
  }

  Future<String> getUserInfo(String pre) {
    return Future.value("$pre world");
  }
  //链式使用
  void loadData() {
    login("hello").then((value) {
      print(value);//输出hello
      return value;
    }).then((value) {
       return getUserInfo(value); //返回的是一个getUserInfo
      //如果是下面这样,那不会等待getUserInfo执行完才执行下一个then
      // getUserInfo(value);
      // return value;
    }).then((value) {
      print(value);//输出hello world
    });
  }
  1. async/await消除回调地狱
    async用来表示函数是异步的,可以使用 then 方法添加回调函数

  loadData() async {
    try {
      String pre = await login("hello").then((value) => "again hello");
       String info= await getUserInfo(pre);
      print("$info");//输出 again hello world
    } catch (e) {
    }
  }

  void test() {
    loadData();
  }

  1. stream
    Stream 也是用于接收异步事件数据,和 Future 不同的是,它可以接收多个异步操作的结果(成功或失败)。在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。
    Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等
Stream.fromFutures([
      // 1秒后返回结果
      Future.delayed(Duration(seconds: 1), () {
        return "hello 1";
      }),
      // 抛出一个异常
      Future.delayed(Duration(seconds: 2),(){
        throw AssertionError("Error");
      }),
      // 3秒后返回结果
      Future.delayed(Duration(seconds: 3), () {
        return "hello 3";
      })
    ]).listen((data){
      print(data);
    }, onError: (e){
      print(e.message);
    },onDone: (){

    });

#上述代码依次输出:
hello 1   Error  hello 3

后记

至此,基础的dart语言就学完啦✿✿ヽ(°▽°)ノ✿

相关文章

网友评论

      本文标题:flutter一语法入门

      本文链接:https://www.haomeiwen.com/subject/tksbndtx.html