初学 Flutter 的一些疑惑(flutter)

发布于 1周前 作者 ionicwang 来自 Flutter

之前在 [ 跨平台应用程序开发框架那家强?] 一贴总请教了一下跨平台框架选型的问题。现在已经进入 Dart 和 Flutter 初学阶段, 目前遇到一些疑惑,再次请教一下各位:

Flutter 在生成目标平台的时候和之前的 Qt 一样都付带一个 Flutter 运行支持库(比如:Windows 会生成一个 flutter_windows.dll ; Android 会生成多个不同架构的 libflutter.so ),第三方框架附带一个运行支持库也不是什么问题,问题是:

  1. 这个库文件是只编译打包了程序依赖的部分,还是不论程序是否用到都一并讲整个框架打包进去(类似 Qt 支持库)? 之所以这样问无非就是整个库太大了(比如:flutter_windows.dll 整个库最小就 15M ),很多时候远远大于纯原生程序,这个问题如何破?

  2. 运行支持库支持静态直接编译进目标程序文件总吗,特别是 Linux / Windows 这种 PC 平台上是否支持?

  3. 这个运行支持库是只能固定这个名字还是可以做自定义(比如: 修改 CMakelist.txt 等方式),毕竟每个平台应用的目录结构,命名规则或者说开发者习惯等都有一些不同,如果是不能修改看起来就很怪异!

  4. 运行支持库生成的时候如何分别增加平台二进制包独有的扩展属性,比如:Windows 下 flutter_windows.dll 这个库 就不包含 版本信息,含文件说明、文件版本、版权等信息。我看框架生成的 exe 都支持这些扩展属性,所以我想应该是可以通过修改 CMakelist.txt 等方式实现。

除了上面运行支持库,框架还会生成一个 data 目录里面又包含了很多文件(如下图),这个文件夹也是必须的吗,还是仅仅是我的程序默认需要这个(因为我删除之后程序启动就闪退)?说实话这个文件及其里面的东西不论从大小( app.so 3M 多)还是里面文件的命名方式( windows 下 app.so )等还是都很难让人感觉到专业。

data

不知道这一些问题是一个跨平台框架需要考虑的问题吗,还是只要实现快速跨平台开发即可,根本不用考虑包大小和个平台特异性和规范的问题?我认为一个应用除了 性能,开发便捷之外,臃肿和是否符合各平台规范和特性应该也应该考量


初学 Flutter 的一些疑惑(flutter)

更多关于初学 Flutter 的一些疑惑(flutter)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

6 回复

最近也用 flutter 做了一个 windows 项目,感觉楼主确实想得挺远的。
release 里的 flutter_windows.dll 15m ,个人感觉应该算跨平台的一个妥协吧,其实不算特别大了。
你的问题如果是比较懂 c++的,看 windows 目录下的源码可能可以找到答案。不过我不懂,所以我都是保持原样。
app.so 这个,他正是你的 dart 代码编译出来的二进制,这个是必须的。

flutter 做 windows 还有一个痛点,就是他是用自己的字体渲染中文,不会读取系统字体,代码里也没法设置系统字体。
而默认的字体渲染中文,经常会出现方框。所以必须额外自带一个字体文件,才能比较好的解决中文乱码问题。
这个字体无形中也增加了整个程序的体积。

更多关于初学 Flutter 的一些疑惑(flutter)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html




1
2
讨论运行支持库大小的问题并不是说要追寻绝对大小,而是对于初学者的我不知道官方有没有做最基本的优化(比如:按需编译),按理来说对于大厂这些都是基本的但是运行支持库确实很大所以很疑惑

3
4
讨论自定义或平台细节问题的出发点还是,虽然用的第三方库来做但也不代表说对细节上没有要求,不想做一个与平台原生风格的差异太大的东西,至少我感觉不是那么好.

flutter_windows.dll 这个文件是 flutter 提前编译好的,直接复制出来给你用,你动不了,除非你自己编译 flutter 引擎。如果你非要加点文件说明,也可以用 PE 编辑工具。

data 下面的不能删,app.so 实际上就是你的 dart 代码编译出来的东西。icu 这个是处理 unicode 字符的东西,也不能删。

压缩成 zip 占用 10M 左右吧,完全能接受了,相比 electron 程序。

中文不需要带字体啊,你设置 ThemeData 的 fontFamilyFallback 就好了。



运行支持库体积问题都还好, 比较现在设备对于这种文件大小都不是事. 最让人难受的是 3 4 这种细节问题, 特别是一直做原生开发的,我相信他们很难接受现在这种文件的组织形式! 那么能自定义目录结构和生成目标文件的名字吗, 比如: 将 data 目录改成 bin 目录, 把 flutter_windows.dll 改成 flutter.dll, app.so 改成 app.dll 或者. 我初步在 CMakelist.txt 文件中尝试了一下修改,结果失败了.

针对你初学Flutter的疑惑,以下是一些专业解答:

  1. @override的理解

    • @override是Dart语言中的一个注解,表示下面的方法是重写父类或接口中的方法。
    • 使用@override的好处包括提高代码可读性、让编译器验证方法名是否正确。
  2. 函数开头的void

    • void关键字表示该函数不返回任何值。
    • 在Flutter开发中,无返回值的函数常用于执行某些操作但不返回结果,如打印日志、更新UI等。
  3. Flutter的设计理念

    • Flutter的设计理念是“一切皆为Widget”。
    • 这意味着应用程序的界面和交互都是由Widget组合而成的,Widget可以嵌套、包裹或组合在一起,形成复杂的UI组件。
  4. 学习建议

    • 对于初学者,建议从Flutter的基础概念入手,如Widget、StatelessWidget、StatefulWidget等。
    • 通过模仿和修改开源Flutter项目的源代码,可以快速提升实践能力。
    • 同时,结合官方文档和教程进行系统学习,理论与实践相结合,以达到更好的学习效果。

希望以上解答能帮助你更好地理解Flutter,并在学习过程中取得进步。

回到顶部