snapshot、dill概念理解

在学习flutter过程中,遇到一些snapshot、dill文件,不知道它们是什么,是做什么的。其实它们是一种dart的编译产物。而snapshot和dill在一些情况下是同一个东西。

dart产物类型

  • exe:可执行文件,自带了精简版的Dart运行环境
  • aot-snapshot:一种特定架构的文件,没有dart运行环境
  • jit-snapshot:一种特定架构的文件。它里面是在程序运行期间生成的已解析的类和已编译的代码
  • kernel snapshot:可移植的二进制快照
  • js:可部署的JavaScript文件

exe(独立可执行文件 self-contained executables)

exe独立可执行文件,可以在Windows、MacOS或Linux上单独运行。是由指定的dart文件及其依赖编译而成。它里面带有小型的dart运行环境,可以用来处理类型检查和垃圾回收。

编译:

dart2native hello.dart

运行:

➜  dartTest ./hello.exe
hello world

上面运行的时候不需要dart命令,由此也可以知道它是独立的可执行文件,内部有dart运行环境。

最新的编译命令:替换了dart2native命令

dart compile exe hello.dart

aot-snapshot

使用AOT snapshots可以减少磁盘空间。它是一种指定当前框架的产物。即:如果你使用macos创建的.aot文件,那么你只能运行在macOS上。

编译:

dart2native hello.dart -k aot

运行:运行时需要使用dartatoruntime命令

➜  dartTest dartaotruntime hello.aot
hello world

最新的编译命令:

dart compile aot-snapshot hello.dart

jit-snapshot

JIT snapshot中有所有的解析类和编译的代码(在程序运行的时候生成的),当运行jit-snapshot时,dart虚拟机不需要再去解析和编译类,因此VM可以运行的更快。

编译:

dart --snapshot-kind=app-jit --snapshot=helloJit.dart.snapshot hello.dart

运行:

➜  dartTest dart helloJit.dart.snapshot              
hello world

最新的编译命令:

dart compile jit-snapshot ./hello.dart

kernel snapshot

kernal snapshot是单个可移植文件,能运行在所有的操作系统和CPU架构上。kernel snapshot包含了dart程序的抽象语法树(AST)的二进制形式

编译:默认不指定kind,就是kernel类型

dart --snapshot-kind=kernel --snapshot=hello1.dart.snapshot hello.dart

运行:

➜  dartTest dart hello1.dart.snapshot                
hello world

最新命令:

dart compile kernel ./hello.dart

查看其生成的文件:hello.dill。由此我们可知dill文件就是snapshot类型为kernel的文件。它们是一个东西

产物大小比较

-rw-r--r--   1 laomao  staff  1007072 May 13 14:05 hello.aot
-rw-r--r--   1 laomao  staff       31 May 12 17:54 hello.dart
-rw-r--r--   1 laomao  staff      568 May 13 14:35 hello.dill
-rwxr-xr-x   1 laomao  staff  7269472 May 13 11:57 hello.exe
-rw-r--r--   1 laomao  staff  3958304 May 13 14:27 hello.jit

可以得出:exe > jit-snapshot > aot-snapshot > kernel > dart source code

exe中有dart运行环境所以很大,jit-snapshot和aot-snapshot是特定架构文件,kernel是AST的二进制文件,可以在平台之间迁移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter中修改数据的方式取决于您使用哪种数据管理方法。以下是一些常见的数据管理方法和它们的修改数据的方法: 1. setState()方法:这是Flutter中最简单的数据管理方法之一。使用setState()方法,您可以在您的widget中修改状态并刷新UI。例如,如果您的widget包含一个计数器,您可以使用setState()方法来增加或减少计数器的值。 ```dart class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Column( children: <Widget>[ Text('Count: $_counter'), RaisedButton( child: Text('Increment'), onPressed: _incrementCounter, ), ], ); } } ``` 2. Provider:Provider是Flutter中的一个状态管理库,它允许您在整个应用程序中共享数据。使用Provider,您可以轻松地修改数据并在整个应用程序中刷新UI。 ```dart // 定义一个数据模型 class CounterModel extends ChangeNotifier { int _counter = 0; int get counter => _counter; void increment() { _counter++; notifyListeners(); } } // 在widget中使用数据模型 class MyWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer<CounterModel>( builder: (context, counterModel, child) => Column( children: <Widget>[ Text('Count: ${counterModel.counter}'), RaisedButton( child: Text('Increment'), onPressed: () { counterModel.increment(); }, ), ], ), ); } } ``` 3. BLoC:BLoC是Flutter中的一种架构模式,它将业务逻辑与UI分离。在BLoC中,您可以使用StreamController来管理数据流,并使用StreamBuilder来刷新UI。 ```dart // 定义一个BLoC class CounterBloc { int _counter = 0; StreamController<int> _counterController = StreamController<int>(); Stream<int> get counterStream => _counterController.stream; void incrementCounter() { _counter++; _counterController.sink.add(_counter); } void dispose() { _counterController.close(); } } // 在widget中使用BLoC class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> { CounterBloc _bloc = CounterBloc(); @override void dispose() { _bloc.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return StreamBuilder<int>( stream: _bloc.counterStream, builder: (context, snapshot) { if (snapshot.hasData) { return Column( children: <Widget>[ Text('Count: ${snapshot.data}'), RaisedButton( child: Text('Increment'), onPressed: () { _bloc.incrementCounter(); }, ), ], ); } else { return Container(); } }, ); } } ``` 以上是一些常见的Flutter数据管理方法和它们的修改数据的方法。您可以根据自己的需要选择最适合您的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值