写一个flutter程序—记录

news2024/11/17 21:37:35

目录

使用外部package

添加一个Stateful widget


Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的,可以用一套代码同时构建Android和iOS应用,性能可以达到原生应用一样的性能。

一句话总结就是:Flutter是一个跨平台、高性能的移动UI框架

这一部分我们写一个简单应用
功能是,为一个创业公司生成建议的公司名称。
用户可以选择和取消选择的名称,保存喜欢的名称。
该代码一次生成十个名称
用户滚动时,生成新一批名称。

着重体验以下几点

  1. Flutter如何在Android、iOS、桌面和web里自动适应不同的UI体系
  2. Flutter工程/项目的基本结构
  3. 查找和使用packages来扩展功能
  4. 使用热重载(hot reload)加快开发周期
  5. 如何实现有状态的widget
  6. 如何创建一个无限的、延迟加载的列表

替换掉lib/main.dart中的内容

import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(const MyApp());  
}

class MyApp extends StatelessWidget{
  const MyApp({super.key});
  
  @override
  Widget build(BuildContext context){
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Welcome to Flutter--appBar'),
          ),
          body: const Center(
            child: Text('Hello World'),
          ),
        ),
    );
  }
}

运行效果:

 

使用外部package

在这一步我们初步了解项目目录中的pubspec.yaml文件的作用
pubspec.yaml管理着Flutter工程中所有的资源和依赖

  1. 通过命令行的方式将包 english_words这个package加入到你的工程,在控制台会输出以下信息

 

依赖关系的获取会自动生成pubspec.lock文件,包含所有加入项目的package和版本号信息

更新main.dart的代码

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main(List<String> args) {
  runApp(const MyApp());  
}

class MyApp extends StatelessWidget{
  const MyApp({super.key});
  
  @override
  Widget build(BuildContext context){
    final wordPair = WordPair.random();
    return MaterialApp(
      title: 'Welcome to Flutter',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Welcome to Flutter--appBar'),
          ),
          body: Center(
            child: Text(wordPair.asPascalCase),
          ),
        ),
    );
  }
}

如果没有关闭运行程序,直接进行热重载,关闭程序的,重新运行
效果如图

 

每次热重载都能看见程序中间的单词改变

添加一个Stateful widget

状态的widgets是不可变的,这意味着他们的属性是不能改变的--所有的值都是final
Dart中的关键字 final有什么作用?
状态的widgets也是不可变的,但其持有的状态可能在widget生命周期中发生变化,实现一个有状态的widget至少需要两个类

  1. 一个StatefulWidget类
  2. 一个State类,StatefulWidget类本身是不变的,但State类在widget生命周期中始终存在
    在这一步,你将添加一个有状态的widget---RandomWords,它会创建自己的状态类--- _RandomWordState,然后你需要将RandomWords内嵌到
    已有的无状态MyApp Widget
    也就是说,想要一个有状态变化的widget需要两个类1.StatefulWidget类---状态不变2.一个State类--状态类
    然后只需要将有状态的widget内嵌到无状态的MyApp widget中,就可以体现出状态的改变
    修改lib/main.dart
import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main(List<String> args) {
  runApp(const MyApp());  
}

class MyApp extends StatelessWidget{
  const MyApp({super.key});
  
  @override
  Widget build(BuildContext context){
    return MaterialApp(
      title: 'Startup Name Generator',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Startup Name Generator'),
          ),
          body: Center(
            child: RandomWords(),
          ),
        ),
    );
  }
}

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

  @override
  State<RandomWords> createState() => _RandomWordsState();
}

class _RandomWordsState extends State<RandomWords> {
  final _suggesttions = <WordPair>[]; //保存建议的单词对
  final _biggerFont = const TextStyle(fontSize: 18);
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemBuilder: (context,i) {
        if(i.isOdd) return const Divider();
        final index = i~/2;
        if(index >= _suggesttions.length){
          _suggesttions.addAll(generateWordPairs().take(10));
        }
        return ListTile(
          title: Text(
            _suggesttions[index].asPascalCase,
            style: _biggerFont,
          ),
        );
      },
    );
  }
}

 然后还有一个难点就是需要体会Dart的语法,类似于匿名函数的写法
Widget是Flutter里的核心类,在Flutter中最核心的是用widgets构建UI界面
widgets是描述一个UI元素的长相及当前的配置与状态。
当widgets的状态改变后,widgets将重构他的描述,框架会与前一个描述做比对,对渲染树从前一个状态到当前的状态做出的最小的改变。

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

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

相关文章

[附源码]Python计算机毕业设计SSM精品旅游项目管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Pytorch安装】windows下,安装了torch但是import torch失败

【Pytorch安装】windows下&#xff0c;安装了torch但是import torch失败问题原因解决问题 输入 python 进入python环境&#xff0c;输入 import torch 但是显示找不到这个包 输入 pip list 查看之前是否安装成功 但是可以看到包都在 原因 电脑中先前安装了多个 python &am…

Ajax用法总结

目录 Ajax简介 Ajax使用 xhr内部五种状态 Ajax在IE浏览器上存在的缓存问题 如何发送post请求 如何取消Ajax请求 ​编辑 jQuery封装的Ajax如何使用&#xff1f; Ajax简介 Ajax全称为Asynchous Javascript And XML&#xff0c;即异步的JS和XML&#xff0c;通过Ajax可以在…

Linux进程的调度

目录 调度策略与调度类 实时调度策略 普通调度策略 调度类 sched_class有几种实现&#xff1a; 完全公平调度算法 调度队列与调度实体 调度类是如何工作的&#xff1f; 调度策略与调度类 在Linux里面&#xff0c;进程大概可以分成两种。 一种称为实时进程&#xff0c;…

Redis主从复制+哨兵模式

必读 redis的主从复制是单向的&#xff0c;只能有主节点到从节点&#xff0c;主节点以写为主从节点以读为主不能写入数据&#xff01;因为系统的80%的需求都是读的需求。 redis服务默认自己是主节点&#xff0c;一个主节点由一个或多个从节点&#xff0c;一个从节点只有一个主…

图信号处理论文

图信号处理并且非图神经网络的论文&#xff1a; Donget.al“GraphSignal Processingfor MachineLearning A Review and New Perspectives," ICASSP Tutorial, June 2021. Lorenzoet.al“Adaptiveleast mean squaresestimation ofgraph signals"IEEE Trans. Signal I…

Vue3 学习笔记 —— 破坏式更新、自定义指令 directive

目录 1. 什么叫破坏式更新&#xff1f; 2. Vue3 中的自定义指令 2.1 自定义指令的生命周期 2.1.1 Vue2 Vs Vue3 的自定义指令生命周期 2.1.2 自定义指令的生命周期中&#xff0c;接收的参数 2.2 定义一个自定义指令 2.2.1 在 setup 中定义自定义指令&#xff08;此处为 …

数据结构 树练习题

目录 判断 选择 判断 1.一棵有124个结点的完全二叉树&#xff0c;其 叶结点个数是确定的。 【答案】正确 【解析】完全二叉树 若设二叉树的深度为h 除第 h 层外 其它各层 1&#xff5e;(h-1) 的结点数都达到最大个数(即1~(h-1)层为一个满二叉树) 第 h 层所有的结点都连续集…

【C++】STL

文章目录回调函数&#xff1a;一、STL的诞生二、STL基本概念三、STL六大组件四、STL中容器&#xff0c;算法&#xff0c;迭代器回调函数&#xff1a; 函数被作为参数传递到另一个函数&#xff08;主要函数&#xff09;的那个函数就叫做 回调函数 一、STL的诞生 C的面向对象和…

DHTMLX Diagram JavaScript/HTML5 Pro Library:5.0

Diagram — JavaScript/HTML5 Diagram Library Ω578867473 破解版DHTMLX Diagram comprises a set of interactive HTML5 UI components such as organization charts, flowcharts, decision trees, block diagrams, mind maps, etc. Consisting of nodes and connectors, di…

i.MX 6ULL 驱动开发 二十八:网络设备

一、网络设备的系统框图 MAC&#xff1a;工作在网络模型的数据链路层&#xff0c;通过 RGMII 或 RMII 接口连接 PHY&#xff0c;MAC 控制器中的 MDIO 控制器提供 MDIO 接口&#xff0c;用于访问 PHY 寄存器。 PHY&#xff1a;工作在网络模型的物理层&#xff0c;是 IEEE802.3 …

SVN项目,提交Git保留之前提交记录

&#x1f4c3;目录跳转简介&#xff1a;1.创建文件2.命令下载:3.上传到远程git3.1 创建远程git工程3.2 添加一个新的远程 Git 仓库3.3 拉取远程master的数据合并3.3 推送远程git分支简介&#xff1a; 由于之前直接搞的项目是部署在自己搭建的SVN服务器上&#xff0c;平时创建的…

5. JVM调优工具详解及调优实战(这里有我的实战案例预制构件生产管理平台)

1. Jmap&#xff0c;Jstack&#xff0c;Jinfo命令详解 1.1 Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jps 先查看有哪些java程序 jmap -histo 16492 > ./log.txt jmap -heap 16492 查看堆的信息 查看堆年轻代老年代的使用情况 堆内存dum…

Matlab:tftb-0.2时频工具箱安装小记

Matlab&#xff1a;tftb-0.2时频工具箱安装小记一、安装过程记录1、解压缩&#xff1a;2、将解压缩后的文件夹复制到自己的Matlab安装目录工具箱下&#xff1b;3、打开Matlab设置路径&#xff1a;设置路径4、测试是否安装成功&#xff1a;5、小试牛刀叮嘟&#xff01;这里是小啊…

【ASE+python学习】-批量识别石墨烯团簇结构中的吡啶氮,并删除与其相连的氢

批量识别石墨烯团簇结构中的吡啶氮&#xff0c;并删除与其相连的氢文章背景任务内容程序实现思路实现代码建立标准结构中边缘碳与氢的位置差值标准数据集读入待修改结构&#xff0c;识别氮与氢位置差值是否存在标准数据集代码细节剖析文章背景 在科研工作中&#xff0c;我的工…

STM32系列(HAL库)——串口IAP

前言 IAP&#xff08;In Application Programming&#xff09;即在应用编程&#xff0c;IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写&#xff0c;目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 设备具备IAP功能…

javaScript学习———变量概述 变量的使用 变量语法扩展 变量命名规范交换 变量案例

博主每篇博文的浪漫主义&#xff1a; 【东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;】 https://www.bilibili.com/video/BV1pG411F7KT/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;…

计算机组成原理--------12.4---------开始

计算机硬件的基本组成 冯诺依曼计算机的特点 冯诺依曼首次提出“存储程序”概念 计算机由五大部件组成&#xff1a;I/O设备&#xff08;输入输出&#xff09;&#xff0c;存储器&#xff08;存放数据和程序&#xff09;&#xff0c;运算器&#xff08;算术运算、逻辑运算&…

[附源码]JAVA毕业设计科研项目审批管理系统(系统+LW)

[附源码]JAVA毕业设计科研项目审批管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

关于解释型语言和编译性语言的区别

关于博主每篇博文的浪漫主义 【初恋是整遍《手写的从前》】 https://www.bilibili.com/video/BV1JP411g7qF/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 初恋是整遍《手写的从前》能够知道解释性语言和编译型语言的特点能够知道标识符不能是关键字…