# flutter_study **Repository Path**: zhangkqq/flutter_study ## Basic Information - **Project Name**: flutter_study - **Description**: 移动客户端开发一定要掌握一门跨平台技术 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-17 - **Last Updated**: 2026-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # flutter_app A new Flutter project. ## Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this is your first Flutter project: - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) For help getting started with Flutter development, view the [online documentation](https://docs.flutter.dev/), which offers tutorials, samples, guidance on mobile development, and a full API reference. 1.注意查看package-lock.json里的flutter-hvigor-plugin配置 { "name": "ohos", "lockfileVersion": 3, "requires": true, "packages": { "": { "dependencies": { "flutter-hvigor-plugin": "file:F:\\flutter\\flutter_flutter\\packages\\flutter_tools\\hvigor" } }, "../../../flutter_flutter/packages/flutter_tools/hvigor": { "name": "flutter-hvigor-plugin", "version": "1.0.0", "license": "ISC", "devDependencies": { "@ohos/hvigor": "5.2.2" } }, "node_modules/flutter-hvigor-plugin": { "resolved": "../../../flutter_flutter/packages/flutter_tools/hvigor", "link": true } } } ###2.一些命令 1)打安卓debug包:flutter build apk --debug 安装安卓debug包 flutter install --debug 2)打鸿蒙debug包flutter build hap --debug 3)查看已连接设备:flutter devices 4)设置SDK:C:\Users\HP>flutter config --ohos-sdk="F:\Program Files\Huawei\DevEco Studio\sdk" 5)查看在环境变量中设置的SDK:echo %HOS_SDK_HOME% 5)git credential-manager reject https://gitee.com 修改密码后清除缓存,然后重新push/pull 修改密码 6)flutter run --trace-startup --profile 统计应用启动时间 ### 安装依赖 flutter pub get 之后重启VSCode ### 重要总结 1、假如我们只想在打开新路由时应用动画,而在返回时不使用动画,那么我们在构建过渡动画时就必须判断当前路由isActive属性是否为true,代码如下: @override Widget buildTransitions(BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { //当前路由被激活,是打开新路由 if(isActive) { return FadeTransition( opacity: animation, child: builder(context), ); }else{ //是返回,则不应用过渡动画 return Padding(padding: EdgeInsets.zero); } } 2.AnimatedSwitcher 源码 Widget _widget; void didUpdateWidget(AnimatedSwitcher oldWidget) { super.didUpdateWidget(oldWidget); // 检查新旧child是否发生变化(key和类型同时相等则返回true,认为没变化) if (Widget.canUpdate(widget.child, oldWidget.child)) { // child没变化,... } else { //child发生了变化,构建一个Stack来分别给新旧child执行动画 _widget= Stack( alignment: Alignment.center, children:[ //旧child应用FadeTransition FadeTransition( opacity: _controllerOldAnimation, child : oldWidget.child, ), //新child应用FadeTransition FadeTransition( opacity: _controllerNewAnimation, child : widget.child, ), ] ); // 给旧child执行反向退场动画 _controllerOldAnimation.reverse(); //给新child执行正向入场动画 _controllerNewAnimation.forward(); } } //build方法 Widget build(BuildContext context){ return _widget; } ####Flutter文件目录 Android 和 iOS 的应用存储目录不同,PathProvider (opens new window)插件提供了一种平台透明的方式来访问设备文件系统上的常用位置。该类当前支持访问两个文件系统位置: 临时目录: 可以使用 getTemporaryDirectory() 来获取临时目录; 系统可随时清除临时目录的文件。在 iOS 上,这对应于NSTemporaryDirectory() (opens new window)返回的值。在 Android上,这是getCacheDir() (opens new window)返回的值。 文档目录: 可以使用getApplicationDocumentsDirectory()来获取应用程序的文档目录,该目录用于存储只有自己可以访问的文件。只有当应用程序被卸载时,系统才会清除该目录。在 iOS 上,这对应于NSDocumentDirectory。在 Android 上,这是AppData目录。 外部存储目录:可以使用getExternalStorageDirectory()来获取外部存储目录,如 SD 卡;由于 iOS不支持外部目录,所以在 iOS 下调用该方法会抛出UnsupportedError异常,而在 Android 下结果是Android SDK 中getExternalStorageDirectory的返回值。 一旦你的 Flutter 应用程序有一个文件位置的引用,你可以使用 dart:io (opens new window)API来执行对文件系统的读/写操作。 ### 生成json文件 flutter pub get flutter pub run build_runner build --delete-conflicting-outputs //清除缓存重新生成 flutter pub run build_runner build //生成model文件 ### 编译成web项目 flutter run -d chrome --web-renderer html flutter build web --web-renderer canvaskit ### Flutter渲染机制 我们也说过组件最终的Layout、渲染都是通过RenderObject来完成的,从创建到渲染的大体流程是:根据Widget生成Element,然后创建相应的RenderObject并关联到Element.renderObject属性上,最后再通过RenderObject来完成布局排列和绘制。 Widget.canUpdate主要是判断newWidget与oldWidget的runtimeType和key是否同时相等,如果同时相等就返回true,否则就会返回false。根据这个原理,当我们需要强制更新一个Widget时,可以通过指定不同的Key来避免复用。 ### build(context)的使用场景 Theme.of(context) //获取主题 Navigator.push(context, route) //入栈新路由 Localizations.of(context, type) //获取Local context.size //获取上下文大小 context.findRenderObject() //查找当前或最近的一个祖先RenderObject Flutter框架提供了一个RenderBox和一个 RenderSliver类,它们都是继承自RenderObject,布局坐标系统采用笛卡尔坐标系,屏幕的(top, left)是原点。而 Flutter 基于这两个类分别实现了基于 RenderBox 的盒模型布局和基于 Sliver 的按需加载模型,这个我们已经在前面章节介绍过。 ### Flutter的绘制流程(setState) dirtyElements 列表:记录所有需要绘制的Element,包括新增的Element和更新的Element。 nodesNeedingLayout列表: nodesNeedingPaint列表: