Flutter - 初体验

项目文件目录结构介绍

注:创建 Flutter 项目名称不要包含特殊字符,不要使用驼峰标识

// TODO

开发中运行一个 Flutter 三种启动方式

Run 冷启动从零开始启动
Hot Reload 热重载执行 build 方法
Hot Restart 热重启重新运行整个 APP

先看效果,最终要实现一个复选框点击效果

代码会从简到繁一点一点增加

代码分析

// Dart 程序入口是 main 函数,Flutter 是 Dart 编写的,所以入口也是 main 函数
main(){/*** 1. runApp 函数 (Flutter 内部提供的一个函数)* 当启动一个 Flutter 应用程序时调用 runApp*/runApp(/*** runApp入参:Widget** 2 Widget(Flutter 中万物皆 Widget)* 整个应用程序中所看到的内容几乎都是 Widget,甚至是内边距的设置,* 需要使用一个叫 Padding 的 Widget 来做*/);
}

改进页面样式

main() {runApp(/*** 需求:* 1 居中显示: 需要使用另外一个Widget,Center* 2 文字大一些: 需要给Text文本设置一些样式* 在 Text 小部件外层包装了一个 Center 部件,让 Text 作为其 child*/Center(child: Text('Hello Flutter',textDirection: TextDirection.ltr,style: TextStyle(fontSize: 28,color: Colors.red))));
}

改进页面结构

main() {runApp(/*** 需求:添加导航栏* 最外层包裹一个 MaterialApp【Material 是 Google 推行的一套设计风格、设计规范】* title:Android 系统中打开多任务切换窗口时显示的标题;(可以不写)* home:应用启动时显示的页面,传入了一个 Scaffold** Scaffold:* 直译:[脚手架],作用:搭建页面的基本结构* 所以给 MaterialApp 的 home 属性传入了一个 Scaffold 对象,作为启动显示的 Widget* Scaffold 也有一些属性,如 appBar 和 body* appBar:用于设计导航栏,传入了一个 title 属性* body:页面的内容,传入了之前已经创建好的 Center 中包裹的一个 Text 的 Widget*/MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Title'),),body: Center(child: Text('Hello Flutter',textDirection: TextDirection.ltr,style: TextStyle(fontSize: 28, color: Colors.red)))),));
}

功能进阶

main() {runApp(/*** 需求:改为一个复选框,复选框右边有说明文案* Row: 一个水平布局的小部件,将子控件水平排列*/MaterialApp(home: Scaffold(appBar: AppBar(title: Text('这是Flutter Title'),),body: Center(child: Row(mainAxisAlignment: MainAxisAlignment.center,children: [Checkbox(value: true,onChanged: (value) => print('Checkbox 被点击了')),Text('同意条款',style: TextStyle(fontSize: 22),)],))),));
}

代码到此层级嵌套已很多,且Checkbox点击有问题,此处会引出 StatefulWidget / StatelessWidget

代码重构

main() {runApp(/*** Flutter 开发过程中会形成一个 Widget树,层级嵌套属正常* Flutter 代码缩进,开发中使用 2个空格** 问题:开发这么简单的程序出现这么多层级嵌套,后期应用程序更复杂层级嵌套会非常恐怖* 解决:可以对代码进行封装,将它们封装到自定义 Widget 中,创建自己的 Widget** 在 Flutter开发中,可以继承 StatelessWidget/StatefulWidget 自定义 Widget 类* 有状态的Widget: StatefulWidget 在运行过程中有一些状态需要改变程序* 无状态的Widget: StatelessWidget 内容是确定没有状态的改变,无状态Widget通常仅仅做一些展示** 先使用 StatelessWidget 重构:* StatelessWidget 通常是一些没有状态(State,也可以理解成data)需要维护的 Widget* 它们的数据通常是直接写死(放在Widget中的数据,必须被定义为 final)* 从 parent widget中传入的且一旦传入就不可修改*/MyApp());
}/*** StatelessWidget 包含一个必须重写的方法:build()* Flutter 在拿到自定义的 StatelessWidget 时,会执行它的 build 方法* StatelessWidget 没办法主动去执行 build方法,当使用的数据发生改变时,build方法会被重新执行** build 方法执行:* 1 当 StatelessWidget 第一次被插入到Widget树中时(第一次被创建时)* 2 当父 Widget(parent widget)发生改变时,子 Widget会被重新构建* 3 如果自定义的 Widget 依赖 InheritedWidget 的一些数据,InheritedWidget数据发生改变时*/
class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: false,home: MyHomePage());}
}class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('这是Flutter Title'),),body: MyCenterBody());}
}// flag:状态
// Stateful不能定义状态 -> 创建一个单独的类,这个类负责维护状态
// Widget 不加下划线_ ,因为需要暴漏给别人使用
class MyCenterBody extends StatefulWidget {@overrideState<StatefulWidget> createState() {return _MyContentBodyState();}
}// State加下划线_ ,因为状态只给 Widget 使用
class _MyContentBodyState extends State<MyCenterBody>{var flag = true;@overrideWidget build(BuildContext context) {return Center(child: Row(mainAxisAlignment: MainAxisAlignment.center,children: [Checkbox(value: flag,onChanged: (value){setState(() {flag = value!;});}),Text('同意条款',style: TextStyle(fontSize: 20),)],));}
}

ListView项目

 

main() => runApp(MyApp());class MyApp extends StatelessWidget{@overrideWidget build(BuildContext context) {return MaterialApp(home: MyHomeContent());}
}class MyHomePage extends StatelessWidget{@overrideWidget build(BuildContext context) {return Scaffold(appBar:AppBar(title: Text('图片列表')) ,body: MyHomeContent(),);}
}class MyHomeContent extends StatelessWidget {@overrideWidget build(BuildContext context) {return ListView(children: [MyItem('kotlin','Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。','https://img1.baidu.com/it/u=3448265981,2295756675&fm=253&fmt=auto&app=138&f=JPEG?w=682&h=343'),SizedBox(height: 8,),MyItem('dart','Dart 是一种基于类的可选类型化编程语言,设计用于创建 Web 应用程序。 Google 称,Dart 的设计目标是为 Web 编程创造结构化但又富有灵活性的语言;','https://img0.baidu.com/it/u=546698500,87821893&fm=253&fmt=auto&app=138&f=PNG?w=1008&h=500'),SizedBox(height: 8,),MyItem('swift','Swift是苹果公司于2014年WWDC苹果开发者大会发布的新开发语言,可与Objective-C共同运行于macOS和iOS平台,用于搭建基于苹果平台的应用程序。','https://img1.baidu.com/it/u=4069946616,401541856&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=374'),],);}
}class MyItem extends StatelessWidget{final String title;final String info;final String imgUrl;// 如果直接写在 Text 内部,每次刷新都会调用,直接提出来final styleTitle = TextStyle(fontSize: 20,color: Colors.blue,decoration: TextDecoration.none);final styleInfo = TextStyle(fontSize: 12,color: Colors.red,decoration: TextDecoration.none);MyItem(this.title,this.info,this.imgUrl);@overrideWidget build(BuildContext context) {return Container(// 设置内边距padding: EdgeInsets.all(12),decoration: BoxDecoration(border: Border.all(width: 2, // 设置边框宽度color: Colors.blue // 设置边框颜色)),child: Column(// 子 widget 对齐方式crossAxisAlignment: CrossAxisAlignment.start,children: [Text(title,style: styleTitle),Text(info,style: styleInfo),// 设置间距SizedBox(height: 8.0),Image.network(imgUrl)],),);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22279.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 手写分页

【先看效果】 &#xff08;1&#xff09;内容小于2页 不展示页码 &#xff08;2&#xff09;1 < 内容页数< 限定展示页码 展示&#xff1a;页码、上下页&#xff1b;隐藏&#xff1a;首页、末页图标&#xff0c;上、下一区间码。即&#xff1a;&#xff08;页数&#…

window安装MySQL5.7

1、下载MySQL5.7.24 浏览器打开&#xff1a; https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-winx64.zip 2、解压缩 下载下来的是一个压缩包&#xff0c;解压到你想放到的目录下面&#xff0c;我放的是“C:\MySQL” 3、配置MySQL环境变量 计算机右键 - 属性 …

Android Studio安装配置及运行

一、下载Android Studio 官网下载&#xff1a;下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面&#xff0c;选择同意条款&#xff0c;并点击下载&#xff0c;如图&#xff1a; 二、详细安装 双击下载的文件 三、配置Android Studio …

电力通信物联网应用,国密网关守护电力数据安全

电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机&#xff0c;主要为上下级控制系统之间的广域网通信提供认证与加密服务&#xff0c;实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证&#xff1a;对接入的设备和用户…

低代码与开发框架的一些整合[2]

1.分析的项目资源说明 经过近期的的不断分析与运行对比&#xff0c;最终把注意力集中在了以下几个框架&#xff1a; 01.dibootdiboot.diboot: 写的更少, 性能更好 -> 为开发人员打造的低代码开发平台。Mybatis-plus关联查询&#xff0c;关联无SQL&#xff0c;性能高10倍&a…

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…

elf_loader:一个使用Rust编写的ELF加载器

本文介绍一个使用Rust实现的ELF加载器。 下面是elf_loader的仓库链接&#xff1a; github&#xff1a; https://github.com/weizhiao/elf_loaderhttps://github.com/weizhiao/elf_loader crates.io&#xff1a; https://crates.io/crates/elf_loaderhttps://crates.io/cra…

python入门 介绍及变量的使用

1.python介绍 python 是一门计算机语言 常见的计算机语言&#xff1a;python、java、C语言。。。 什么是计算机语言&#xff1a;就是让计算机知道你想干什么&#xff0c;把你的需求使用它能听懂的语言说出来 中国也有一门计算机语言&#xff1a;易语言 能认为是语言的本质上…

Scala基础学习

主要用来处理数据&#xff0c;不处理web&#xff0c;没有类似spring的框架 1. Scala简介 我们基于的scala版本 2.12.10 scala是运行在 JVM 上的多范式&#xff08;规范&#xff09;编程语言&#xff0c;同时支持面向对象和面向函数编程。&#xff08;真实数据与操作过程解耦…

贪心算法

int a[1000], b5, c8; swap(b, c); // 交换操作 memset(a, 0, sizeof(a)); // 初始化为0或-1 引导问题 为一个小老鼠准备了M磅的猫粮&#xff0c;准备去和看守仓库的猫做交易&#xff0c;因为仓库里有小老鼠喜欢吃的五香豆&#xff0c;第i个房间有J[i] 磅的五香豆&#xf…

复现论文:DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization

论文&#xff1a;[2403.16697] DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization github: TYLfromSEU/DPStyler: DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization 论文: 这篇论文还是在PromptStyler:Prompt-driven Style Gener…

AI 编程助手 cursor的系统提示词 prompt

# Role 你是一名极其优秀具有10年经验的产品经理和精通java编程语言的架构师。与你交流的用户是不懂代码的初中生&#xff0c;不善于表达产品和代码需求。你的工作对用户来说非常重要&#xff0c;完成后将获得10000美元奖励。 # Goal 你的目标是帮助用户以他容易理解的…

TikTok账户安全指南:如何取消两步验证?

TikTok账户安全指南&#xff1a;如何取消两步验证&#xff1f; 在这个数字化的时代&#xff0c;保护我们的在线账户安全变得尤为重要。TikTok&#xff0c;作为全球流行的社交媒体平台&#xff0c;其账户安全更是不容忽视。两步验证作为一种增强账户安全性的措施&#xff0c;虽…

详解分布式ID实践

引言 分布式ID&#xff0c;所谓的分布式ID&#xff0c;就是针对整个系统而言&#xff0c;任何时刻获取一个ID&#xff0c;无论系统处于何种情况&#xff0c;该值不会与之前产生的值重复&#xff0c;之后获取分布式ID时&#xff0c;也不会再获取到与其相同的值&#xff0c;它是…

react 踩坑记 too many re-renders.

报错信息&#xff1a; too many re-renders. React limits the number of randers to prevent an infinite loop. 需求 tabs只有特定标签页才展示某些按钮 button要用 传递函数引用方式 ()>{} *还有要注意子组件内loading触发 导致的重复渲染

【干货教程】Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …

关于YApi接口操作

YApi有 接口集合 和 测试集合 两个概念。 接口集合 将接口进行分类&#xff0c;使接口结构更清晰&#xff0c;一个接口只能属于一个集合&#xff0c;且不允许与其他接口重名。测试集合 为了方便我们测试接口&#xff0c;测试集合 将若干接口组合在一起&#xff0c;在这里一个接…

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类&#xff0c;用于构建 API 视图。这些视图类可以分为以下几类&#xff1a; 1. 基础视图类 这些是 DRF 中最基础的视图类&#xff0c;通常用于实现自定义逻辑。 常用类 APIView&#xff1a; 最基本的视图类&#xff0c;所有其…

Django简介

Django是什么 Web应用程序是指在服务器端运行的程序&#xff0c;不需要单独安装&#xff0c;而Django就是其中一个非常流行的框架。 网站运行的主要原理 网站运行的本质就是服务器与客户端之间的数据传输&#xff0c;而其中&#xff0c;超文本传输协议&#xff08;HTTP&…

JavaScript基础-函数(完整版)

文章目录 函数基本使用函数提升函数参数arguments对象&#xff08;了解&#xff09;剩余参数(重点)展开运算符(...) 逻辑中断函数参数-默认参数函数返回值-return作用域(scope)全局作用域局部作用域变量的访问原则垃圾回收机制闭包 匿名函数函数表达式立即执行函数 箭头函数箭头…