Flutter系列文章-Flutter基础

news2025/2/1 23:00:48

Flutter是Google推出的一种新的移动应用开发框架,允许开发者使用一套代码库同时开发Android和iOS应用。它的设计理念、框架结构、以及对Widget的使用,都让开发者能更有效率地创建高质量的应用。

一、Flutter设计理念

Flutter的设计理念是“一切皆为Widget”。这意味着不论是按钮、字体、颜色、布局,甚至是你的整个应用程序,都是由一个个Widget组合而成。在Flutter中,Widget可以嵌套、包裹或组合在一起,形成复杂的UI组件,这给了开发者极大的灵活性和创造力。

二、Flutter框架结构

Flutter框架由一系列层次结构构成。自底向上,主要包括:

  • Dart平台:Flutter使用Dart语言编写,Dart平台包括一个能够为Flutter生成原生ARM代码的Dart JIT和AOT编译器。

  • Flutter引擎:主要用C++编写,它提供了低级渲染支持。它还负责插件系统、文本布局和类型设置、网络和文件 I/O、线程管理等。

  • Foundation库:提供了和Dart一致的基本类型和实用工具,使得其他更高级别的库可以共享相同的设计和实现。

  • Widgets:描述应用程序用户界面和交互的模块。关键概念包括Widget、StatelessWidget、StatefulWidget、State等。

三、Flutter中的Widget

Flutter中的Widget即是声明UI的视图,也是视图和界面变化的桥梁。一个Widget可以定义:

一个结构元素(如按钮或菜单)
一个样式元素(如字体或颜色模式)
甚至是布局方面的元素(如填充或对齐方式)
在Flutter中,Widget的主要任务是提供一个build()方法,用于描述在UI中所看到的内容。

四、StatelessWidget和StatefulWidget

StatelessWidget是不可变的。它们描述了在给定配置下应该如何构建UI。而StatefulWidget则可以在生命周期内改变状态。实现一个StatefulWidget至少需要两个类:1)一个StatefulWidget类;2)一个State类。

五、基础布局Widgets

在Flutter中有很多布局Widget,比如Row,Column和Stack等。Row和Column是基本布局Widget,它们都接受一列子Widget,并在水平或垂直方向上排列。Stack可以将Widget堆叠在一起,实现各种复杂的布局。

六、Flutter程序结构

一个基本的Flutter程序通常包括以下部分:

  • main函数:应用的入口点。
  • MyApp类:StatelessWidget,返回一个包含应用主题、路由和主页的MaterialApp Widget。
  • 主页类:可为StatelessWidget或StatefulWidget,包含应用主体部分。
  • 其他Widget类:你自定义的Widget,可被主页类或其他Widget类使用。
    掌握了这些基础知识,你就能更好地使用Flutter框架进行应用开发,创建出精美并具有良好用户体验的应用程序。

七、Flutter的Widget

7.1. 基础Widgets

在Flutter中,所有的界面元素都是由Widget构建的。每一个Widget都描述了界面上应该看到什么。你可以把Widget看作是应用界面的一个构建块。它们包括用于显示文字、图片、图标、输入框以及行为等的元素。

7.1.1 Text:这个widget用于显示简单的样式文本,它包含一些控制文本显示样式的属性。####

Text(
  'Hello, World!',
  textAlign: TextAlign.center,
  style: TextStyle(fontWeight: FontWeight.bold),
)

7.1.2 Image:用于显示图片的widget,支持多种方式的图片加载,例如网络、资源、文件系统等。

Image.network('https://example.com/images/sample.jpg')

7.1.3 Icon:Material Design的图标widget。

Icon(Icons.star, color: Colors.red[500])

7.2. Widget类型:StatelessWidget和StatefulWidget。

7.2.1. StatelessWidget

StatelessWidget是不可变的,它描述了在给定配置下应该如何构建UI。例如,下面的代码展示了如何创建一个自定义的StatelessWidget,它返回一个红色的星星图标:

class MyIcon extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Icon(Icons.star, color: Colors.red[500]);
  }
}

7.2.2. StatefulWidget

StatefulWidget是动态的。它们可以在生命周期内改变状态,例如响应用户的交互。一个StatefulWidget至少需要两个类:StatefulWidget类和State类。以下是一个例子:

class Counter extends StatefulWidget {
  Counter({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _CounterState createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('You have pushed the button $_counter times.'),
        RaisedButton(
          onPressed: _incrementCounter,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

这个例子创建了一个名为Counter的新StatefulWidget。每当用户按下"Increment"按钮时,_counter 的值就会增加,并且UI会自动更新。

八、Flutter的基本布局Widgets

在Flutter中,我们有许多预定义的布局Widget,例如Row、Column和Stack。

8.1. Row和Column

Row和Column是两个最常用的布局Widget。它们都接受一列子Widget,并在水平或垂直方向上排列。以下是一个使用Row的例子,它包含了三个红色的星星图标:

Row(
  mainAxisAlignment: MainAxisAlignment.spaceAround,
  children: <Widget>[
    Icon(Icons.star, color: Colors.red[500]),
    Icon(Icons.star, color: Colors.red[500]),
    Icon(Icons.star, color: Colors.red[500]),
  ],
)

8.2. Stack

Stack是一个布局Widget,它可以将子Widget堆叠在一起。你可以使用Positioned widget来定位Stack中的子Widget。以下是一个简单的Stack示例:

Stack(
  alignment: const Alignment(0.6, 0.6),
  children: [
    CircleAvatar(
      backgroundImage: AssetImage('images/pic.jpg'),
      radius: 100.0,
    ),
    Container(
      decoration: BoxDecoration(
        color: Colors.black45,
      ),
      child: Text(
        'Hello World',
        style: TextStyle(
          fontSize: 20.0,
          fontWeight: FontWeight.bold,
          color: Colors.white,
        ),
      ),
    ),
  ],
)

九、下面我们创建一个Flutter的示例应用,包括之前提到的一些关键概念,包括Widget,StatelessWidget,StatefulWidget,以及Row,Column和Stack布局。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  MyHomePage({required this.title, key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  void _decrementCounter() {
    setState(() {
      _counter--;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                FloatingActionButton(
                  onPressed: _incrementCounter,
                  tooltip: 'Increment',
                  child: Icon(Icons.add),
                ),
                FloatingActionButton(
                  onPressed: _decrementCounter,
                  tooltip: 'Decrement',
                  child: Icon(Icons.remove),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

通过这篇文章,你应该对Flutter有了一个基础的理解,包括Flutter的设计理念、框架结构、Widget系统、以及如何使用不同类型的Widgets来创建界面和布局。接下来,我们会深入到更高级的主题,包括如何处理用户交互,如何创建动画,以及如何访问网络数据等等。

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

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

相关文章

安装hive数据仓库

部署hive数据库 环境准备 需要安装部署完成的Hadoop的环境如果不会搭建的可以参考&#xff1a; 安装mysql 卸载Centos7自带的mariadb rpm -qa|grep mariadbrpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodepsrpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64是使用…

ToT: 利用大语言模型进行有意识的问题解决(上)

ToT 摘要介绍利用大语言模型进行有意识的问题解决1. 思维分解2. 思维产生 G(p,s,k)3. 状态评估V(p,S)4. 搜索算法 实验相关工作讨论 原文&#xff1a; 摘要 语言模型正在迅速成为一般问题解决的部署&#xff0c;但在推理过程中仍然局限于 标记级别&#xff08;token-level&…

uniapp左右滑动切换月份

左右滑动触发事件 给组件绑定事件,主要利用组件的触摸开始和触摸结束事件来实现: <view @touchstart="touchStart" @touchend="touchEnd"> 2,声明初始化点击位置变量startX data() {return {list:[],pageNum:1,pageSize:10,//初始化点击位置…

手撕Spring06

概述 该章节通过各种Context解决上下文问题&#xff0c;使用模版方法的设计模式&#xff0c;并增加了bean实例化之前、beanc初始化前后的扩展点整体设计 知识点补充 类图 context context包下主要是传递上下文、调用core.io、beans等包下的实际功能完成&#xff0c;配置文件…

12.11 FS4412开发环境搭建

目录 开发边硬件资源介绍 地址映射表 硬件控制原理 load/store 地址映射表4个G包括 开发边硬件资源介绍 地址映射表 硬件控制原理 1.数据运算指令&#xff08;CPU内部&#xff09; 2.跳转指令&#xff08;CPU内部&#xff09; 3.load/store&#xff08;通过读写对硬件…

测试的基本概念(测试系列2)

目录 前言&#xff1a; 1.什么是需求 1.1需求的定义 1.2为什么有软件需求 1.3测试人眼里的需求 2测试用例 2.1什么是测试用例 2.2为什么要有测试用例 3.软件错误&#xff08;BUG&#xff09; 3.1什么是bug 4.软件的生命周期 5.开发模型 5.1瀑布模型 5.2螺旋模型 …

【PHP源码】手术麻醉管理系统介绍

手术麻醉管理系统是什么&#xff1f; 手术麻醉信息管理系统是数字化手段应用于手术过程中的重要组成部分&#xff0c;用数字形式获取并存储手术相关信息&#xff0c;既便捷又高效。既然是管理系统&#xff0c;那就是一整套流程&#xff0c;管理患者手术、麻醉的申请、审批、安…

c#语法问题记录

1.using using 语句定义一个范围&#xff0c;在此范围的末尾将释放对象。using 指令为命名空间创建别名&#xff0c;或导入在其他命名空间中定义的类型。 2. internal sealed partial class internal&#xff1a; 关键字是类型和类型成员的访问修饰符。sealed &#xff1a;应…

IndexDB完整使用指南

IndexDB完整使用指南 数据存储是大多数 Web 应用程序的重要组成部分&#xff0c;从跟踪用户数据到应用程序数据。随着更快、更强大的 Web 应用程序的快速开发&#xff0c;需要高效的客户端存储来帮助开发。 多年来&#xff0c;Web 上的客户端存储已经发生了很大的变化&#x…

极智AI | torch与torchvision版本对应关系速查

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文来介绍一下 torch与torchvision版本的对应关系。 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码下载&#xff0c;链接&#x…

2023年湖北安全员ABC考试题型有哪些?考多少分及格呢?

2023年湖北安全员ABC考试题型有哪些&#xff1f;考多少分及格呢&#xff1f; 安全员分为交通厅、水利厅和建设厅三个部门颁发&#xff0c;每个部门发的安全员证书也是不一样的。那么今天启程别跟大家讲的是建设厅安全员ABC证书报考的一些事宜&#xff08;启程别是谁&#xff1f…

稀疏光流法跟中移动物体、监督学习聚类、K均值聚类、加载深度神经网络模型、深度神经网络模型的使用

目录 1、稀疏光流法跟中移动物体 2、监督学习聚类 3、K均值聚类 4、加载深度神经网络模型 5、深度神经网络模型的使用 1、稀疏光流法跟中移动物体 //稀疏光流法跟中移动物体 vector<Scalar> color_lut;//颜色查找表 void draw_lines(Mat &image, vector<Point…

程序员如何90天成功转行黑客(网络安全)?

有人说&#xff1a;”黑客到底比程序员高在哪&#xff0c;为什么很多人开始转行了“ 其实黑客都是程序员&#xff0c;但是并不是所有的程序员都是黑客. 从企业和社会需求来看&#xff0c;现在真不缺程序猿 &#xff0c;反而大量的缺安全工程师 &#xff0c;同样8000块月薪&am…

【Spring框架】spring更简单的读取和存储对象

目录 前置工作更加简单的存储Bean对象类注解存储Bean命名问题Java项目标准分层五大类注解之间的关系方法注解Bean重命名Bean的几种方式 前置工作 在spring-config.xml添加如下配置&#xff1a; 配置bean的扫描根路径&#xff1a;只有当前目录下的类才会扫描是否添加了注解&…

【Android Framework系列】第7章 WMS原理

1 前言 前面【Android Framework系列】第5章 AMS启动流程和【Android Framework系列】第6章 AMS原理之Launcer启动流程我们分析了AMS启动以及Launcher启动的整体流程&#xff0c;那Launcher(Activity启动)后&#xff0c;UI是如何渲染到屏幕并且展示出来的呢&#xff1f;我们这…

零代码编程:用ChatGPT批量提取网页上的文本信息内容

现在有很多个网页&#xff1a; 要批量提取网页内的文本&#xff1a; 可以在ChatGPT中这样写提示词&#xff1a; 你是一个Python专家&#xff0c;写一段Python程序&#xff0c;完全提取网页文本内容的任务&#xff0c;下面是一步步的步骤&#xff1a; 打开表格文件&#xff0c…

麒麟SP3X86系统下,安装Oracle11g数据库

目录 1、写在前面 2、准备工作 2.1 环境准备 2.2 数据库安装前准备 2.2.1 安装依赖 2.2.2 系统环境准备 2.2.3 上传软件安装包 2.2.4 安装调图形化界面的依赖和相关设置 3、执行安装程序 1、写在前面 随着国产化进程&#xff0c;各大应用需要在国产服务器上面进行部署…

【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

Java基础教程之面向对象 第九讲 本节学习目标1️⃣ 抽象类1.1 抽象类定义1.2 抽象类的相关限制1.3 抽象类应用——模板设计模式 2️⃣ 接口2.1 接口定义2.2 接口的应用——标准2.3 接口的应用——工厂设计模式 (Factory)2.4 接口的应用——代理设计模式 (Proxy) 3️⃣ 抽象类与…

前端自动化测试工具 Cypress 试用调研记录

目录 前言 环境准备 1.工具&#xff1a;vs code&#xff1b;环境&#xff1a;node.js。 2.安装 cypress 3.安装插件&#xff1a; 4.配置&#xff1a; 5.启动命令&#xff1a; helloworld&#xff1a; 第一个用例 元素定位方式 使用 request 请求进行登录 提取登录方…

SpringMVC中@ControllerAdvice 注解的三种使用场景

全局异常处理 /**可以定义多个方法&#xff0c;不同的方法处理不同的异常。如专门处理空指针的方法&#xff0c;专门处理数组越界…… */ ControllerAdvice public class MyGlobalExceptionHandler{ExceptionHandler(Exception.class)//指定异常处理类型public ModelAndView c…