Flutter循序渐进==>第一个界面

news2024/11/26 3:08:17

导言

const MyApp({Key? key}) : super(key: key);
  • const: 这个关键字表示这是一个编译时常量构造函数。当一个类使用 const 构造函数初始化时,它的所有字段都将被设置为编译时常量,并且该对象将在编译时就被创建出来。这对于状态不变(immutable)的对象特别有用,因为它可以帮助提高性能,尤其是在构建UI时。不过,在Flutter中,对于 StatelessWidget 和 StatefulWidget 的构造函数,使用 const 更多是一种习惯用法,用以强调这个类是不可变的,即使它内部的字段可能并不是编译时常量。

  • MyApp({Key? key}): 这是构造函数的定义。这里,MyApp 是类名,大括号 {} 内部定义了构造函数的参数。在Flutter中,Key 是一个很重要的概念,用于在构建UI树时唯一标识组件,帮助Flutter框架确定哪些部件发生了变化,从而高效地更新界面。这里的 Key? 表示 key 参数是可选的(由于 ?),并且它的类型是 Key。使用 Key? 而不是 Key 允许你在不提供此参数的情况下实例化 MyApp 类。

  • : super(key: key);: 这一行代码调用了超类(通常是 StatelessWidgetStatefulWidget)的构造函数,并将接收到的 key 参数传递给了超类。在Flutter中,当你创建一个新的 StatelessWidget 或 StatefulWidget 类时,你实际上是在扩展这些基础类。通过 super 关键字调用基类构造函数,并传递相同的 key 参数,可以确保基类也能访问和使用这个 key,这对于保持 widget 树的状态管理非常重要。

效果图

源代码

import 'package:flutter/material.dart';
import 'package:slow_steady/main.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context)  {
    const title = '平心静气!';

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
          foregroundColor: Colors.limeAccent,
          backgroundColor: Colors.purple,
          leading: IconButton(onPressed: (){},icon: const
              Icon(Icons.menu)),
        ),
        bottomNavigationBar: const BottomAppBar(
          color: Colors.purple,
          shape:CircularNotchedRectangle(),
          child:SizedBox(
            height: 300,
            child: Center(child:Text("底部导航栏",
              style: const TextStyle(fontSize: 20,color: Colors.yellow),))
          )
        ),
        body: Column(
          children: [
            Expanded(child: MyContainerWidget())
          ],
        ),
      )
    );
  }
}

class DataItem {
  final String title;
  final String subtitle;
  final String url;

  const DataItem({
    required this.title,
    required this.subtitle,
    required this.url,
});
}

//DataView 类包含一个final字段 item,这意味着一旦初始化,item 的值就不能再改变。
// item 字段的类型是 DataItem,并且它被初始化为一个具有特定属性值的 DataItem 实例。
class DataView {
  final DataItem item = const DataItem(
    title: '我要学Flutter',
    subtitle: '怎样才能变成Flutter大师?',
    url:'https://picsum.photos/250?image=9');
}
//MyContainerWidget 是一个 StatelessWidget,意味着它是一个不会改变状态的UI组件。

// 构造函数 MyContainerWidget({Key? key}) 接受一个可选的 Key 参数,这是Flutter中用于唯一
// 标识widget的常见做法,有助于在widget树中高效管理状态变更。: super(key: key);
// 表示它将接收到的 key 传递给了父类(即 StatelessWidget)的构造函数。

// final DataView data = DataView(); 在这个类内部定义了一个final字段 data,
// 并初始化为一个新的 DataView 实例。这意味着每个 MyContainerWidget 实例都会持有一个自己的
// DataView 对象,其中包含之前定义的 DataItem 信息。
class MyContainerWidget extends StatelessWidget {
  MyContainerWidget({Key? key}) : super(key: key);
  final data = DataView();

  @override
  Widget build(BuildContext context) {
    return Container(
      //margin:EdgeInsets.only(left: 50.0),
      width: double.infinity,
      height: 350,
      color: Colors.green,
      child: Column (
        children: [
          Image.network(
              data.item.url,
              fit:BoxFit.cover,
          ),
          Text(
            data.item.title,
            style: const TextStyle(fontSize: 20,color: Colors.white),
          ),
          Text(
            data.item.subtitle,
            style: const TextStyle(fontSize: 16,color: Colors.yellow),
              ),
          Text(
            "2024年6月20日",
            style: const TextStyle(fontSize: 16,color: Colors.white),
              ),
        ],
      )
    );
  }
}

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

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

相关文章

基于单片机和LabVIEW 的远程矿井水位监控系统设计

摘要 : 针 对 现 有 矿 井 水 位 监 控 系 统 存 在 结 构 复 杂 和 不 能 远 程 监 控 的 问 题 , 设计了基于单片机和LabVIEW 的远程矿井水位监控系统 , 详…

python-(opencv)视频转glf

文章目录 前言python-(opencv)视频转glf1. 下载 opencv-python2. cv2(OpenCV)和imageio的区别3. demo源码 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说…

uView 2.0:uni-app生态的利剑出鞘,引领UI框架新纪元

引言 随着移动互联网的快速发展,跨平台应用开发成为了开发者们关注的焦点。uni-app,一个基于Vue.js的跨平台应用开发框架,因其高效、易用的特性而广受欢迎。在uni-app的生态系统中,UI框架的选择对于开发者而言至关重要。今天&…

2024上海CDIE 参展预告 | 一站式云原生数字化平台已成趋势

为什么企业需要进行数字化转型?大家都在讨论的数字化转型面临哪些困境?2024.6.25-26 CDIE数字化创新博览会现场,展位【A18】,期待与您相遇,共同探讨企业如何利用数字化技术驱动业务增长。 一、展会介绍——CDIE数字化…

C语言 | Leetcode C语言题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n & (n - 1);}return n; }

【Linux操作系统】进程地址空间与动态库加载

当系统执行一个依赖动态库的可执行程序时&#xff0c;系统不仅要将该可执行程序加载到内存中还要由加载器将动态库加载到内存中&#xff08;静态库没有&#xff09;&#xff0c;因此必须要让加载器知道该动态库的名称&#xff0c;系统会默认在/lib64路径下查找&#xff0c;解决…

Java将list数组中重复的对象进行去重

/*** 数组去重*/ public class ArrayDistinct {public static void main(String[] args) {ArrayList<Object> list new ArrayList<>();JSONObject jsonObject1 new JSONObject();jsonObject1.put("name","张三");jsonObject1.put("age&…

Vite: 关于Rollup打包

概述 Rollup 是一款基于 ES Module 模块规范实现的 JavaScript 打包工具&#xff0c;在前端社区中赫赫有名&#xff0c;同时也在 Vite 的架构体系中发挥着重要作用不仅是 Vite 生产环境下的打包工具&#xff0c;其插件机制也被 Vite 所兼容&#xff0c;可以说是 Vite 的构建基…

kubekey 安装高可用 kubernetes 集群

1. 准备环境 1.1 机器准备 4 台机器&#xff0c;操作系统&#xff1a;Ubuntu 24.04/RHEL8/CentOS9 10.111.3.53 master1 10.111.3.54 master2 10.111.3.55 master3 10.111.3.57 node41.2 安装依赖和配置 所有节点都需要执行&#xff1a; Ubuntu: apt-get install -y soca…

JeeSite中的数据库表动态建模与管理模块(DBM)

一、引言 在现代软件开发中&#xff0c;数据库作为系统数据存储和管理的核心&#xff0c;其设计和维护的灵活性、可扩展性对于系统的长期稳定运行至关重要。JeeSite作为一款流行的企业级快速开发平台&#xff0c;其数据库表动态管理模块&#xff08;DBM&#xff09;提供了强大…

UWB:DS-TWR( Double-sided two-way ranging)双边测距公式推导:为啥是乘法?

UWB DS-TWR&#xff08; Double-sided two-way ranging&#xff09;双边测距为啥是乘法&#xff1f;&#xff1f; 公式&#xff1a; 我们先看单边 Single-Sided Two-Way Ranging (SS-TWR) 单边很好理解。 symmetric double-sided TWR (SDS-TWR)对称的双边测距 再看双边 Trou…

相机系列——从相机畸变到托勒密地图

by 木一 标签&#xff1a;#相机畸变 #畸变纠正 #鱼眼相机 #折射定律 #托勒密地图 引言 前文[1][2]我们介绍了针孔相机模型&#xff0c;以及针孔相机模型的相机标定过程&#xff0c;但针孔相机模型是对相机成像最简单的描述&#xff0c;实际的相机成像过程要远复杂很多。 首先…

C++ | Leetcode C++题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; class Solution { public:int rangeBitwiseAnd(int m, int n) {while (m < n) {// 抹去最右边的 1n n & (n - 1);}return n;} };

Flutter循序渐进==>Dart之类型、控制流和循环

导言 磨刀不误砍柴工&#xff0c;想搞好Flutter&#xff0c;先学好Flutter&#xff0c;还是本着我学Python的方法&#xff0c;先从数据类型、控制流和循环开始&#xff0c;这是每一种编程语言必用的。编程语言是相通的&#xff0c;基本精通一种后&#xff0c;学其它的就变得很…

macos Automator自动操作 app, 创建自定义 应用程序 app 的方法

mac内置的这个 自动操作 automator 应用程序&#xff0c;可以帮助我们做很多的重复的工作&#xff0c;可以创建工作流&#xff0c; 可以录制并回放操作&#xff0c; 还可以帮助我们创建自定的应用程序&#xff0c;下面我们就以创建一个自定义启动参数的chrome.app为例&#xff…

Unity解决报错:Execution failed for task ‘:unityLibrary:BuildIl2CppTask‘

目录 编辑器版本2020.3.33f1 及 2021.3.15f1 直接导出apk或aar报错(虽然会自动生成temp的AS工程&#xff0c;经过打开验证 也是无解的)&#xff1b; 唯一解决办法&#xff1a;Unity导出As工程没问题&#xff1b; 编辑器版本2020.3.33f1 及 2021.3.15f1 直接导出apk或aar报…

黑马点评项目总结1-使用Session发送验证码和登录login和 使用Redis存储验证码和Redis的token登录

黑马先是总结了从session实现登录&#xff0c;然后是因为如果使用了集群方式的服务器的话&#xff0c;存在集群共享session互相拷贝效率低下的问题&#xff0c;接着引出了速度更快的内存型的kv数据库Redis&#xff0c; 使用Session发送验证码和登录login 举个例子&#xff1a…

深度神经网络——决策树的实现与剪枝

概述 决策树 是一种有用的机器学习算法&#xff0c;用于回归和分类任务。 “决策树”这个名字来源于这样一个事实&#xff1a;算法不断地将数据集划分为越来越小的部分&#xff0c;直到数据被划分为单个实例&#xff0c;然后对实例进行分类。如果您要可视化算法的结果&#xf…

SQL注入和防御方法

SQL注入是一种攻击手段&#xff0c;通过在SQL查询中插入恶意SQL代码片段&#xff0c;欺骗数据库服务器执行非授权的数据库操作。这种攻击可能导致数据泄露、篡改或丢失。为了防范SQL注入&#xff0c;可以采取以下几种策略&#xff1a; 1.使用预编译语句&#xff08;Prepared St…

OBD诊断(ISO15031) 01服务

文章目录 功能简介PID 的功能请求和响应1、read-supported PIDs1.1、请求1.2、肯定响应 2、read PID value1.1、请求1.2、肯定响应 3、同时请求多个PID3、同时读取多个PID数据 Parameter definition报文示例1、单个PID请求和读取2、多个PID请求和读取 功能简介 01服务&#xf…