Flutter学习1 - Android开发者快速上手

1、对应关系

  • 概念对应关系
AndroidFlutter
页面Activity和FragmentWidget
视图ViewWidget
页面跳转IntentNavigater
网络库okHttphttp
数据存储SharedPreference和SQLiteshared_preferences和sqflite
  • 布局对应关系
AndroidFlutter
布局文件xmlWidget
线性布局LinearLayoutRow和Column widget
相对布局RelativeLayout组合使用Column、Row和Stack Widget
文本框TextViewtext
输入框EditTextTextField
  • 滚动列表对应关系
AndroidFlutter
布局文件xmlWidget
滚动视图ScrollViewListView
列表ListViewListView
列表RecyclerViewListView.builder

2、快速上手布局开发

(1)更新 Widget 状态

在这里插入图片描述

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: const MyHomePage(title: 'Flutter Demo Home Page'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {String tips = "";Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: Text(tips),),floatingActionButton: FloatingActionButton(onPressed: _updateTips,tooltip: 'Update',child: const Icon(Icons.add),),);}//更新布局 widgets//类似android中 setTextvoid _updateTips() {//我们无法改变widget,因为 Flutter 中 widget 是不可变的//但是可以通过 setState 改变 widget状态setState(() {tips = "快速上手 Flutter";});}
}
  • 在body中添加一个Text,其取值为 tips
  • 按钮的点击事件 _updateTips() 中,通过 setState() 改变 tips 的值,从而更新 widget 状态

该示例类似于 android 中的 textView.setText(tips)

(2)布局中添加/删除一个 Widget

在这里插入图片描述

在这里插入图片描述

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'muke flutter',theme: ThemeData(primarySwatch: Colors.red,),home: const MyHomePage(title: 'muke learning'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {bool _toggle = true;get _dyWidget => _toggle ? const Text("Widget 1") : const Text("Widget 2");Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: _dyWidget,),floatingActionButton: FloatingActionButton(onPressed: _updateWidget,tooltip: 'Update',child: const Icon(Icons.add),),);}//在布局中添加/删除一个 widget//类似安卓中 addView、removeViewvoid _updateWidget() {setState(() {_toggle = !_toggle;});}
}
  • body中添加一个 Text,这个 Text 会根据 _toggle 的值变换,Text(“Widget 1”)或Text(“Widget 2”)
  • 按钮点击事件 _updateWidget() 通过 setState() 更改 _toggle 的值,从而实现更换 widget 效果

(3)创建自定义 Widget

在这里插入图片描述

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'muke flutter',theme: ThemeData(primarySwatch: Colors.red,),home: const MyHomePage(title: 'muke learning'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: const Center(child: TipsWidget(),),);}
}//自定义 Widget
class TipsWidget extends StatelessWidget {const TipsWidget({super.key});Widget build(BuildContext context) {return const Text("自定义 Widget");}
}
  • 自定义 TipsWidget,然后添加至 body 中

(4)添加一个滚动列表

在这里插入图片描述

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'muke flutter',theme: ThemeData(primarySwatch: Colors.red,),home: const MyHomePage(title: 'muke learning'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {get _listView => ListView(children: const [Text("AAA"),Text("BBB"),Text("CCC"),Text("DDD"),Text("EEE",style: TextStyle(fontSize: 230),)],);Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body:  Center(child: _listView,),);}
}
  • 添加一个 ListView,当超出屏幕时就会滚动

3、手势事件处理

(1)监听 Widget 手势

在这里插入图片描述

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'muke flutter',theme: ThemeData(primarySwatch: Colors.red,),home: const MyHomePage(title: 'muke learning'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {int _count = 0;Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: ElevatedButton(child: Text("click me : $_count"),onPressed: () {setState(() {_count++;});},),),);}
}
  • 点击按钮实现 +1

(2)GestureDetector手势监听

在这里插入图片描述

import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return MaterialApp(title: 'muke flutter',theme: ThemeData(primarySwatch: Colors.red,),home: const MyHomePage(title: 'muke learning'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {int _count = 0;Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: GestureDetector(child: Text("click me : $_count"),onTap: () {setState(() {_count++;});},onLongPress: () {setState(() {_count = 0;});},),),);}
}
  • GestureDetetor 只是对 Text 添加了一个手势监听,没有按钮样式
  • onTap():单机时,加一
  • onLongPress():长按时,清零

4、进阶

(1)异步 UI

(2)页面跳转

(3)工程结构和资源文件

(4)网络请求

(5)数据存储

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

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

相关文章

在线图片生成工具:定制化占位图片的利器

title: 在线图片生成工具&#xff1a;定制化占位图片的利器 date: 2024/2/20 14:08:16 updated: 2024/2/20 14:08:16 tags: 占位图片网页布局样式展示性能测试响应式设计在线生成开发工具 在现代的网页设计和开发中&#xff0c;占位图片扮演着重要的角色。占位图片是指在开发过…

力扣日记2.20-【回溯算法篇】491. 非递减子序列

力扣日记&#xff1a;【回溯算法篇】491. 非递减子序列 日期&#xff1a;2023.2.20 参考&#xff1a;代码随想录、力扣 ps&#xff1a;放了个寒假&#xff0c;日记又搁置了三星期……&#xff08;下跪忏悔&#xff09; 491. 非递减子序列 题目描述 难度&#xff1a;中等 给你一…

各种手型都合适,功能高度可定制,雷柏VT9PRO mini和VT9PRO游戏鼠标上手

去年雷柏推出了一系列支持4KHz回报率的鼠标&#xff0c;有着非常敏捷的反应速度&#xff0c;在游戏中操作体验十分出色。尤其是这系列4K鼠标不仅型号丰富&#xff0c;而且对玩家的操作习惯、手型适应也很好&#xff0c;像是VT9系列就主打轻巧&#xff0c;还有专门针对小手用户的…

二维红外流程

x.1 开激光器 先将TDG&#xff0c;TCU&#xff0c;Empower打开&#xff0c;等一分钟后将TDG和Empower的钥匙打到On上&#xff1b; 按顺序先后开MaiTai&#xff1b;ACE&#xff1b;TOPAS&#xff1b;AOM&#xff1b; 测量ACE出光口处功率&#xff08;3.8w&#xff09;&#x…

MybatisPlus多表联查-分页关联查询+根据id获取多表联查后的单行数据

分页关联查询 需求分析 有两张表w以及d&#xff0c;需要w的一些字段以及d的一些字段在前端显示 此时就需要用到关联查询&#xff0c;查询到的数据放入视图类&#xff0c;显示在前端 项目结构 视图类 package com.wedu.modules.tain.entity.vo;import lombok.Data;import ja…

【算法】约瑟夫环问题解析与实现

一、导言 约瑟夫环&#xff08;Josephus Problem&#xff09;是一个经典的数学问题&#xff0c;涉及一个编号为 1 到 n 的人围成一圈&#xff0c;从第一个人开始报数&#xff0c;报到某个数字 m 的人出列&#xff0c;然后再从下一个人开始报数&#xff0c;如此循环&#xff0c…

挑战杯 基于RSSI的室内wifi定位系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; wifi室内定位系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;…

仿照elementUI写个步骤条

效果图如下&#xff1a; 直接上代码&#xff1a; <template><div class""><div class"steps"><div class"step" v-for"(step, index) in steps" :key"index"><divclass"icon"click&…

深度学习发展的艺术

将人类直觉和相关数学见解结合后&#xff0c;经过大量研究试错后的结晶&#xff0c;产生了一些成功的深度学习模型。 深度学习模型的进展是理论研究与实践经验相结合的产物。科学家和工程师们借鉴了人类大脑神经元工作原理的基本直觉&#xff0c;并将这种生物学灵感转化为数学模…

公司有多个域名,是不是每个域名都安装一个SSL证书?

公司有多个域名&#xff0c;是不是每个域名都安装一个SSL证书&#xff1f; 拥有多个域名可能意味着会增加管理的复杂性和维护成本。如果您的公司有很多个域名&#xff0c;并不是每个域名都要逐个安装SSL证书。可以考虑购买多域名SSL证书或通配符SSL证书&#xff0c;而不是为每…

【Java】上传图片至阿里云oss服务器,文件上传以及图片base64上传

目录 引入maven依赖编写ossUtil编写Controller使用接口工具进行测试测试表单文件上传测试base64文件上传 首先需要在阿里云上开通oss服务&#xff0c;并获取到以下四个信息 endpoint: 购买的服务器节点地址accessKeyId: 接入的keyIdaccessKeySecret: 接入的key秘钥bucketName&…

[计算机网络]---UDP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、端口号…

MyBatis数据库查询

文章目录 什么是MyBatisMyBatis程序的创建MyBatis实现数据库查询传参查询插入实现添加操作获取自增ID删除实现修改实现#{}和${}SQL注入 like查询 resultMap和resultType多表查询 对于普遍的后端开发而言&#xff0c;其程序主要包含了后端主程序和数据库两个部分&#xff0c;用户…

C/C++ BM11 链表相加(二)

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 这道题使用链表来实现加法运算&#xff0c;主要是涉及到数据对位以及加法进位的处理。 题目 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0…

使用C# Net6连接国产达梦数据库记录

达梦官网&#xff1a;http://www.dameng.com/ 1 下载达梦并进行安装 下载地址&#xff1a;官网首页——服务与合作——下载中心&#xff08;https://www.dameng.com/list_103.html&#xff09; 根据需要自行下载需要的版本&#xff0c;测试版本为&#xff1a;x86 win64 DM8版…

微信商户平台:如何查看超级管理员

如果有普通员工身份&#xff0c;可以登录 https://pay.weixin.qq.com/index.php/core/account/info 扫码进入后&#xff0c;进入菜单&#xff1a;账户中心》商户信息&#xff0c; 即可看到超级管理员的信息。

Windows 重启 explorer 的正确做法

目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者…

VsCode指定插件安装目录

VsCode指定插件安装目录 VsCode安装的默认目录是在用户目录(%HomePath%)下的.vscode文件夹下的extensions目录下&#xff0c;随着安装插件越来越多会占用大量C盘空间。 指定VsCode的插件目录 Vscode安装目录&#xff1a; D:\Microsoft VS Code\Code.exeVscode插件安装目录&a…

算法沉淀——递归(leetcode真题剖析)

算法沉淀——递归 01.汉诺塔问题02.合并两个有序链表03.反转链表04.两两交换链表中的节点05.Pow(x, n) 递归是一种通过调用自身的方式来解决问题的算法。在递归算法中&#xff0c;问题被分解为更小的相似子问题&#xff0c;然后通过对这些子问题的解进行组合来解决原始问题。递…

实现VLAN间通信以太网链路聚合与交换机堆叠、集群华为ICT网络赛道

10.实现VLAN间通信 10.1.使用路由器实现VLAN间通信 使用路由器物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。 路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access. 路由器的一个物理接口作为一…