一,概述

元数据概述

    元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

元数据定义

    元数据(Metadata)是描述其它数据的数据(data about other data),或者说是用于提供某种资源的有关信息的结构数据(structured data)。元数据是描述信息资源或数据等对象的数据,其使用目的在于:识别资源;评价资源;追踪资源在使用过程中的变化;实现简单高效地管理大量网络化数据;实现信息资源的有效发现、查找、一体化组织和对使用资源的有效管理。 

元数据(MetaData)如何理解
元数据是用来描述数据的数据(Data that describes other data)。单单这样说,不太好理解,我来举个例子。

(她)年纪已经不轻,三十岁上下,个子高挑,身材匀称,黑黑的眉毛,红红的脸蛋--一句话,不是姑娘,而是果冻,她那样活跃,吵吵嚷嚷,不停地哼着小俄罗斯的抒情歌曲,高声大笑,动不动就发出一连串响亮的笑声:哈,哈,哈!

 这段话里提供了这样几个信息:年龄(三十岁上下)、身高(个子高挑)、相貌(身材匀称,黑黑的眉毛,红红的脸蛋)、性格(活跃,吵吵嚷嚷,不停地哼着小俄罗斯的抒情歌曲,高声大笑)。有了这些信息,我们就可以大致想像出瓦莲卡是个什么样的人。推而广之,只要提供这几类的信息,我们也可以推测出其他人的样子。

    这个例子中的”年龄”、”身高”、”相貌”、”性格”,就是元数据,因为它们是用来描述具体数据/信息的数据/信息。

二,dart中元数据

使用元数据给代码添加更多的信息。
元数据是以@开始的修饰符,在@后面接着编译时的常量或调用一个常量构造函数。
目前dart语言提供三个@修饰符:

(注解) – @deprecated 被弃用的。  

含义:若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用。
作用:因为在一个项目中,工程比较大,代码比较多,而在后续开发过程中,可能之前的某个方法实现的并不是很合理,这个时候就要新加一个方法,而之前的方法又不能随便删除,因为可能在别的地方有调用它,所以加上这个注解,就方便以后开发人员的方法调用了。

class Television {
  @deprecated
  void activate(){
    turnOn();
  }

  void turnOn(){
    print('Television Turn On!');
  }

}

main(){
   dynamic tv = new Television();
   tv.activate();
   tv.turnOn();
}

打印结果:

[Running] dart "/var/folders/l1/jvw4fvds26320gck06xj7xdh0000gn/T/tempCodeRunnerFile.dart"
Television Turn On!
Television Turn On!

(注解) – @override重写。

帮助自己检查是否正确的复写了父类中已有的方法
告诉读代码的人,这是一个复写的方法

//动物类
class Animal {
    //动物会吃
    void eat(){
      print('动物会吃');
    }
    //动物会跑
    void run(){
      print('动物会跑');
    }
}
//人类
class Human extends Animal {
  void say (){
     print('人会说话');
  }

  void study(){
    print('人类也会吃');
  }

  @override 
  void eat(){
     print('人类也会吃');
  }
}

main (){
  print('实例化一个动物类');
  var animal = new Animal();
  animal.eat();
  animal.run();

  print('实例话一个人类');
  var human = new Human();
  human.eat();
  human.run();
  human.say();
  human.study();
}

@proxy 代理。

@required 来标记一个参数,表示这个参数必须要传值。

告诉编译器这个参数必须要传值
告诉读代码的人,这个参数必须要填写

MyScaffold({Key key,@required this.items}):super(key:key);

定义自己的元数据

通过library来定义一个库,在库中定义一个相同名字的class,然后在类中定义const 构造方法。  

// 定义
library todo;
 
class todo {
  final String who;
  final String what;
 
  const todo(this.who, this.what);
}
 
// 使用
import 'todo.dart';
 
@todo('seth', 'make this do something')
void doSomething() {
  print('do something');

三,总结

  元数据可以修饰以下内容

library(库), 
class(类), 
typedef(类型定义), 
type parameter(类型参数), 
constructor(构造函数), 
factory(工厂函数), 
function(函数), 
field(作用域), 
parameter(参数),
variable declaration(变量声明)。