这一部分我们写一个简单应用

功能是,为一个创业公司生成建议的公司名称。

用户可以选择和取消选择的名称,保存喜欢的名称。

该代码一次生成十个名称

用户滚动时,生成新一批名称。

着重体验以下几点

  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将重构他的描述,框架会与前一个描述做比对,对渲染树从前一个状态到当前的状态做出的最小的改变。

写一个flutter程序的更多相关文章

  1. 写一个ajax程序就是如此简单

    写一个ajax程序就是如此简单 ajax介绍: 1:AJAX全称为Asynchronous JavaScript and XML(异步JavaScript和XML),指一种创建交互式网页应用的网页开发 ...

  2. [Java] 将标准字符流写入到文件中(通过控制台写一个html程序,并保存)

    package test.stream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Fi ...

  3. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  4. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  5. 利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  6. linux常用终端指令+如何用vim写一个c程序并运行

    在装好ubuntu之后今天学习了一些linux的一些基础知识: windows里面打开命令窗口是win+r,在linux系统里面,ctrl+alt+t打开终端,今天的一些指令都是围绕终端来说的 首先s ...

  7. 用tkinter写一个记事本程序(未完成)

    之前在看tkinter与python编程 ,后面学opengl就把那本书搁置了.几天没用tkinter,怕是基本的创建组件那些都忘记了,所以想着用tkinter试着写一下记事本程序.一开始的时候以为很 ...

  8. Linux内核学习--写一个c程序,并在内核中编译,运行

    20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,“忍不住”跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直 ...

  9. 基础概念(3):怎么写一个c程序?

    总结卡片: 遵循c语言的规则,即可写出c程序.规则下有两个重要概念:函数与变量.就好像游戏中的打仗,要考虑怎么打,谁来打."怎么打"就是流程,把流程封装起来就是函数,流程也叫算法. ...

  10. 为Dynamics 365写一个简单程序实现解决方案一键迁移

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复258或者20170627可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

随机推荐

  1. C++ 左值引用与一级指针

    将**左值引用**用于**一级指针**时,有以下几种用法: ```c++ //方式一:引用一级指针,常规用法 int a = 5; int * pa = &a; int * &rpa ...

  2. C++ "链链"不忘@必有回响之双向链表

    C++ "链链"不忘@必有回响之双向链表 1. 前言 写过一篇与单链表相关的博文(https://blog.51cto.com/gkcode/5681771),实际应用中,双向循环 ...

  3. 等保审核 --- MySQL密码复杂度--和连接错误超时等

    系统版本: Centos 7 MySQL版本: 5.7.19 架构: 主从架构 审计插件: validate_password.so(数据库自带5.6后版本都拥有此插件) 操作过程: 1). 安装va ...

  4. Docker安装部署Rancher

    # 一.Rancher简介 [Rancher](https://www.cnrancher.com/rancher/)是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开 ...

  5. 改变一个数组内元素的位置,不通过splice方法。

    这个数据 现在已经完成了,将本来在第一位的18代金券改到第31位,下面说一下怎么实现的. //currHotRightsTypeSorted这个是数据源头,legalRightsType这个是数据的分 ...

  6. IDEA设置问题

    一. IDEA 相关设置 1.1 去除SQL语句的黄色背景 Settings > Editor > Inspections > SQL No data sources configu ...

  7. 「Tubian」Tubian0.41!支持Windows QQ微信!

    Tubian 0.42已发布:https://www.cnblogs.com/tubentubentu/p/16745926.html Sourceforge.net下载:https://source ...

  8. 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践

    [点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...

  9. 微信小程序分享好友,朋友圈

    <template> <view> <button open-type="share">发送给好友</button> </vi ...

  10. display:block 和display:inline-block的区别和用法

    1).块状元素:(div,p,form,ul,ol,li) ,独占一行,默认情况width为100% 2).行内块状元素:(span,img,a),不会独占一行,相邻的元素一直排在同一行,排满了才会换 ...