Flutter入门——从简单的计数器demo入手

news2024/11/30 10:29:35

Flutter入门——从简单的计数器demo入手

前言

flutter是现如今很热门的跨平台开发框架,只需要一套代码就能在六个平台上运行,现在在移动端的应用比较成熟,本片文章会是Flutter的简单入门,从一个简单的demo入手分析

笔者是Android原生开发者,现在由于在实习时公司也需要使用flutter进行开发,接下来会把自己学习的学习心得记录下来,持续更新,main方法是程序的入口,在main方法中有runApp方法,这个方法需要传入Widget

demo的效果图

demo的界面样式

demo的具体解析

void runApp(Widget app) {
  final WidgetsBinding binding = WidgetsFlutterBinding.ensureInitialized();
  assert(binding.debugCheckZone('runApp'));
  binding
    ..scheduleAttachRootWidget(binding.wrapWithDefaultView(app))
    ..scheduleWarmUpFrame();
}

Widget有两类,有状态的StatefulWidget和无状态的StatelessWidget

这里我们传入一个无状态的Widget,MyApp

void main() {
  runApp(const MyApp());
}

可以看到MyApp有一个const修饰,表示编译时常量,可以在编译时就能确定值,从而提高一点性能

看一下MyApp的代码:

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

继承StatelessWidget 表示这个Widget是无状态的Widget,还需要重写build方法,build方法中会返回一个Widget

接下来我们完成build方法的具体实现:

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Flutter",
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true 
      ),
      home: MyHomePage(),
    );
  }
}

我们使用了一个MaterialApp,这个用来指定风格采用Android的风格,其中使用了title参数指定在手机的多任务管理中显示的名称

image-20240818183313432

theme中自定了主题,这里设置了颜色,指定使用material3,这些属性都是在打开app后只加载一次的东西,所以我使用了无状态的Widget

在home中,是具体的页面是什么样,往往需要改变界面的状态,所以我使用了一个StatefulWidget,

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  
  Widget build(BuildContext context) {
    return const Placeholder();
  }
}

在MyHomePage中,继承StatefulWidget表示它是一个有状态的Widget,其中需要重写createState方法,这个方法会返回一个State,我指定泛型为对应的MyHomePage,用了_MyHomePageState方法来写具体的实现,这里的=>是dart中的一个语法糖

在_MyHomePageState中,重写build方法,在build方法返回一个Widget,接下来我会具体实现build方法

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  int _number = 0;

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.amber,
        title: Text(
            widget.title,
        ),
      ),
      body: Center(
        child: Column(
          children: [
            const Text('你已经点击了这么多次:'),
            Text('$_number', style: Theme.of(context).textTheme.headlineLarge,)
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: (() {
          _number++;
          setState(() {
          });
        }),
        child: const Icon(Icons.add),
      ),
    );
  }
}

在build方法中,我首先使用了一个脚手架Scaffold,可以看成是页面的一个抽象,其中主要有三个部分:顶部appBar,中间界面的主要内容body,底部导航栏bottomNavigationBar, 底部导航栏在这个demo中暂时不需要,之后再详细说

image-20240818192947028

在Scafford的appBar参数中,我传入了AppBar,其中backgroundColor用于设定导航栏的背景颜色,title指定具体内容,这里我使用了一个Text,其中用到在MyHomePage中定义的变量title

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

在MyHomePage中我添加了类型为String的变量title,用于表示AppBar的标题内容,相应构造函数也需要改变,在this.title前面添加了required,表示这个参数是必须要传入的

在_MyHomePageState中,就可以通过widget.title得到在MyHomePage中定义的title变量。接下来,在Scafford的body中是界面的主要内容,我先用了个Center,让其中子Widget能够居中显示,它的子Widget用child指定,我传入了一个Column,让子Widget能够竖向排列,比较类似Android原生中的LinearLayout,children参数需要传入Widget数组,表示Column中多个子Widgt,我用了个Text提示点击次数,还添加了floatingActionButton,在onPressed中处理点击事件,在child中指定具体显示的内容,在onPressed中加入了setState方法用于触发更新,如果不调用这个,界面是不会更新的

flutter中是由数据驱动UI,响应式思维,有点类似与在原生中使用的MVVM架构,在数据更新后能自动更新UI,实际上在调用setState方法后,会重写指定build方法,所以没有调用的时候呢,即使数据改变,界面是不会发生改变的

运行一下,这个简单的计时器demo就做好啦

recording

关注我,继续分享开发知识

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

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

相关文章

OpenCvSharp.Internal.NativeMethods“的类型初始值设定项引发异常

错误截图&#xff1a; WPF项目 A界面按钮方法调用成员实例B里面这个初始化Mat对象方法 后台ViewModel代码类似&#xff1a; AViewModel{ B b; public void BtnClick(){ b.test(); } } 报错&#xff1a; 看一眼根据经验确认是DLL的问题&#xff0c;于是乎把nuget包配置和…

毛中特25版肖1000题选择题知识点(乱序)

马原&#xff1a;马原25版肖1000题选择题知识点&#xff08;乱序&#xff09;-CSDN博客 毛泽东明确提出的&#xff0c;是把马克思列宁主义基本原理同中国具体实际进行“第二次结合&#xff0c;找出在中国怎样建设社会主义的道路”的任务&#xff0c;不是“第二个结合”(马克思…

USB3.2 摘录(五)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; USB3.2 摘录&#xff08;五&#xff09; 文章目录 系列文章目录8 协议层&#xff08;Protocol Lay…

爽了!免费的SSL,还能自动续期,支持CDN/OSS!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主小傅哥。 从今年开始&#xff0c;越来越多的云服务厂商开始限制了 ssl 1年期的申请&#xff0c…

Linux驱动学习之点灯(四,linux2.6)

上篇最后的第二种点灯方法年代比较久远&#xff0c;register_chrdev&#xff08;&#xff09;这个函数一下申请了255个设备号&#xff0c;不建议使用 如下图 下图的函数在linux2.6里是上图函数的升级版&#xff0c;不过他是静态分配&#xff0c;后续还得添加到cdev里 从上图函…

计算机的演进之路:历史与组成结构全解析

一、计算机发展历史 &#xff08;一&#xff09;早期计算工具 在计算机诞生之前&#xff0c;人类为了进行计算发明了许多工具。例如&#xff0c;中国古代的算筹和算盘&#xff0c;它们在一定程度上满足了人们进行简单数学运算的需求。而在西方&#xff0c;古希腊的安提凯希拉…

收银系统源码-千呼新零售2.0【线下收银】

千呼新零售2.0系统由零售行业连锁店一体化收银系统和多商户入驻平台商城两个板块组成&#xff0c;打造门店平台的本地生活即时零售模式。 其中连锁店收银系统包括线下收银私域商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。…

相机模型与成像过程:深入解析相机内参、外参及标定方法

相机模型与成像过程&#xff1a;深入解析相机内参、外参及标定方法 引言 相机作为图像采集的重要设备&#xff0c;在图像处理、计算机视觉及机器视觉等领域扮演着核心角色。了解相机的成像原理、模型参数及标定方法&#xff0c;对于提升图像质量和后续处理效果至关重要。本文…

嵌入式学习Day36---Linux软件编程---网络编程

目录 一、TCP并发模型 1.1.阻塞IO 1.2.非阻塞IO 1.步骤 2.函数接口 3.实例 1.3.异步IO 1.步骤 2.函数接口 3.实例 1.4.多路复用IO 1.select 函数接口&#xff1a; 实例 2.poll 3.epoll 二、总结 一、TCP并发模型 1.1.阻塞IO CPU占用率低,等待资源时将任务挂…

初识指针5の学习笔记

目录 1>>前言 2>>qsort函数的实现 2.1>>什么时qsort函数&#xff1f; 2.2>>qsort函数的格式是什么&#xff1f; 2.3>>qsort函数的解析 2.4>>qsort函数的实现&#xff01; 3>>结语 1>>前言 今天我会继续分享一些我做的笔…

大模型基础学习知识,看这一篇就够了

​ 学习路线&#xff1a;感性认识现象->理解本质和原理->将所学知识用于解释新现象并指导实践。 ​ LLM训练模型的的三个阶段&#xff1a; 1、Pre-train 2、Supervised Fine-Tuning&#xff1a;Instruction Fine-tuning 3、RLHF - > RLAIF&#xff1a;增强式学习…

Internet Download Manager(下载工具)中文授权版

IDM是一款windows平台下的下载工具。 软件截图&#xff1a; 使用说明&#xff1a; 解压后&#xff0c;双击start_IDM.bat来运行软件 下载地址&#xff1a; IDM-v6.42.20-Repack 解压密码&#xff1a;helloh 下载时可能会有广告&#xff0c;忽略&#xff0c;等下载结束即可…

IM 旗舰版、IM 尊享版计费说明(海外 - 北美数据中心)

本文档详细描述了适用于使用海外北美数据中心 App 的 IM 旗舰版、IM 尊享版计费套餐及相应增值服务项目的计费细则。 本文档中采用人民币定价&#xff0c;价格仅适用于以人民币结算的服务订单。如果您使用非人民币结算&#xff0c;请咨询相关商务人员。 The English version o…

React 使用ref属性调用子组件方法(也可以适用于父子传参)

注意&#xff1a;①需使用hooks函数组件 ②使用了antDesign组件库&#xff08;可不用&#xff09; 如何使用 父组件代码 import React, { useState, useRef, useEffect } from react; import { Button } from antd; import Child from ./components/child;export defau…

华为面试题就这?24岁的我直接拿下28K的offer...

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 先说一下我的情况&#xff0c;某普通本科计算机&#xff0c;之前在深圳那边做了大约半年多少儿编程老师&#xff0c;之后内部平调回长沙这边&#xff0c;回来之后发…

LLaVA 简介:一种多模式 AI 模型

LLaVA 是一个端到端训练的大型多模态模型&#xff0c;旨在根据视觉输入&#xff08;图像&#xff09;和文本指令理解和生成内容。它结合了视觉编码器和语言模型的功能来处理和响应多模态输入。 图 1&#xff1a;LLaVA 工作原理的示例。 LLaVA 的输入和输出&#xff1a;连接视觉…

大型语言模型(LLM)历史简介

在 DALL-E 2 中生成的图像。 介绍 当我们谈论大型语言模型 (LLM) 时&#xff0c;我们实际上指的是一种能够以类似人类的方式进行交流的高级软件。这些模型具有理解复杂上下文并生成连贯且具有人情味的内容的惊人能力。 如果您曾经与 AI 聊天机器人或虚拟助手聊天&#xff0c…

搜维尔科技:【研究】Haption Virtuose外科手术触觉视觉学习系统的开发和评估

Haption面临挑战 除此之外&#xff0c;外科医生有时会对骨组织进行非常复杂的手术&#xff0c;其中一个例子是人工耳蜗的手术植入。重要的是要避免神经或血管等危险结构受伤&#xff0c;并尽可能轻柔地进行手术。在外科医生能够安全、无差错地进行此类手术之前&#xff0c;需要…

WKWebView加载项目中网页的资源图片路径异常

问题原因&#xff0c;将含有html的文件通过如下方式引入到工程中&#xff1a; 这种处理方式&#xff0c;当应用程序变以后&#xff0c;引入的文件会被全部放在Resources目录下&#xff0c;而忽略你原本的文件路径信息。因此导致出问题。 解决方案&#xff1a; 采用如下方式引…

输入一个列表,返回手动反转后的新列表

import math def deverseHanshu(*nums):listAlist(nums)for i in range(0,math.ceil(len(listA)/2)): #math.ceil(3.14) #4clistA[-(i1)]listA[-(i1)]listA[i]listA[i]creturn listA print(deverseHanshu(45,3,89,45,56,2,22,10))#方法2 def getReverse(listAttr):resultList[…