学习笔记-Flutter-dart语法(2)

一、extendsion

void main(){
  print('常规写函数方法: ${convertPointToUnit(3)}');
  print('extension 用法:${3.pointToUnit}');
}

/// 通常的写法,封装转换方法
/// 给数字 加5 在整除2
int convertPointToUnit(int num) {
  return (num + 5) ~/ 2;
}

/// 拓展写法 给int增加这样一个方法
extension _ExInt on int {
   int get pointToUnit => (this + 5) ~/ 2;
}

打印输出:

二、call方法

void main(){
  Person person = Person();

  // 这样就会直接调用Person的call方法,注意必须名称为call,方法名为其他 会标红
  var result = person("huahua", 13);
  print('result => $result');
}


class Person {
  late String name;
  late int age;

  int call(String name, int age) {
    print('Name is $name ,Age is $age');
    return 3;
  }
}

打印输出:

 三、noSuchMethod

/// noSuchMethod
/// java ---> noSuchMethodException
/// js ---> undefined
/// 在语言设计过程中,如果存在动态执行概念(如java的反射-找不到、js的dynamic)
void main() {
  // var = 1 实在初始化阶段进行类型推断了
  // dynamic 不做类型检查   直接提对应的熟悉,函数
  dynamic object = 1;
  // 次无效代码将调用整数1的noSuchMethod方法,其中Invocation表示.add(42)调用和参数   然后抛出
  // 类可以覆盖 noSuchMethod 以为此类无效动态调用提供自定义行为
  object.add(412);
}

打印输出:

 可实现noSuchMethod,进行一些处理

void main() {
  MockList().add(423);
  print(MockList());
}

class MockList<T> implements List<T> {
  @override
  noSuchMethod(Invocation invocation) {
    // invocation.noSuchMethod(invocation); 如果这么调用 就会像之前报错
    print('找不到方法');
  }
}

打印输出:

四、反射

import 'dart:mirrors';

/// 反射
/// 类加载
/// java --每个类身上都有标记 如 package xxx.xx.xxx
/// dart --动态类型的方案
void main() {
  refClass();
}

void refClass() {
  Symbol name = Symbol('A');

  ClassMirror classMirror = reflectClass(A);
  // 实例A类
  var instance = classMirror.newInstance(Symbol.empty, [1]);
  classMirror.declarations.forEach((key, value) {
    print('${key} ==>  ${value}');
  });

  // 获取 class 上的元数据
  // classMirror.metadata.forEach((element) {
  //   print('${element.reflectee.who} ==>  ${element.reflectee.what}');
  // });

  // instance.reflectee A对象,打印1
  print(instance.reflectee.a);
}


class A{
  int a;

  A(this.a) {
    print('$a');
  }
}

运行结果:

 五、注解

import 'dart:mirrors';

/// 反射
/// 类加载
/// java --每个类身上都有标记 如 package xxx.xx.xxx
/// dart --动态类型的方案
void main() {
  refClass();
}

void refClass() {
  Symbol name = Symbol('A');


  // 实例A类
  ClassMirror classMirror = reflectClass(A);
  var instance = classMirror.newInstance(Symbol.empty, [1]);

  // 获取 class 上的元数据,可以通过元数据来获取注解的信息
  classMirror.metadata.forEach((element) {
    print('${element.reflectee.who} ==>  ${element.reflectee.what}');
  });

  // instance.reflectee A对象,打印1
  // 如果reflectee使用了类中没有的方法  会报NoSuchMethod错误
  print(instance.reflectee.a);
}

@Todo("类上的注解", "5")
class A{
  int a;

  A(this.a) {
    print('实例化:$a');
  }
}

class Todo {
  final String who;
  final String what;
  const Todo(this.who, this.what);
}

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值