Flutter 开发学习笔记(1):第一个简单的Flutter项目(上)

文章目录

  • 前言
  • 相关链接
  • 初始化项目
  • 设置键盘映射
    • 建议使用AnLink链接物理机。
  • 项目配置
  • 日志打印
  • 官方案例
    • 添加依赖
    • 主函数更换
    • 添加最简单的按钮
    • Flutter 项目结构
      • Flutter项目入口
      • Flutter的MyApp函数
    • 更新视图
      • 直接修改
      • 浅拷贝父节点数据
      • 思考
    • 修改布局
      • 子节点重构
      • 子节点布局重构
      • 多次扩展布局
      • 设置颜色主题

前言

为了得到的得到Uniapp的上位替代,最近打算使用Flutter开发。一般开发需要3个UI框架,icons库+UI框架+统计图

相关链接

【Flutter – 基础】快速入门 Flutter

Flutter 中文文档

编写第一个 Flutter 应用

在这里插入图片描述

初始化项目

注意,后续的代码主要就是抄官方的案例来的

编写第一个 Flutter 应用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置键盘映射

我习惯用vscode 的快捷键了,这里设置一下。
在这里插入图片描述
在这里插入图片描述

建议使用AnLink链接物理机。

在这里插入图片描述

在这里插入图片描述

项目配置

在这里插入图片描述

# 降低代码检验的标准,让我们更简单的使用dart
linter:
  rules:
    prefer_const_constructors: false
    prefer_final_fields: false
    use_key_in_widget_constructors: false
    prefer_const_literals_to_create_immutables: false
    prefer_const_constructors_in_immutables: false
    avoid_print: false

日志打印

日志打印使用[print]函数即可

print('hello flutter');

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

官方案例

添加依赖

在这里插入图片描述
在[pubspec.yaml]中添加

name: namer_app
description: A new Flutter project.

publish_to: 'none' # Remove this line if you wish to publish to pub.dev

version: 0.0.1+1

environment:
  sdk: '>=2.19.4 <4.0.0'

# 这个就是Flutter对应的第三方库了
dependencies:
  flutter:
    sdk: flutter

  english_words: ^4.0.0
  provider: ^6.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter

  flutter_lints: ^2.0.0

flutter:
  uses-material-design: true

主函数更换

在这里插入图片描述

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

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

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

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => MyAppState(),
      child: MaterialApp(
        title: 'Namer App',
        theme: ThemeData(
          useMaterial3: true,
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),
        ),
        home: MyHomePage(),
      ),
    );
  }
}

class MyAppState extends ChangeNotifier {
  var current = WordPair.random();
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var appState = context.watch<MyAppState>();

    return Scaffold(
      body: Column(
        children: [
          Text('A random idea:'),
          Text(appState.current.asLowerCase),
        ],
      ),
    );
  }
}

确保没有报错之后测试运行

在这里插入图片描述

添加最简单的按钮

在这里插入图片描述

return Scaffold(
      body: Column(
        children: [
          Text('A random idea str:'),
          Text(appState.current.asLowerCase),
          //添加新的按钮
          ElevatedButton(
              onPressed: () {
                print('button click');
              },
              child: Text('Next'))
        ],
      ),
    );

在这里插入图片描述
在这里插入图片描述

Flutter 项目结构

Flutter项目入口

在这里插入图片描述

Flutter的MyApp函数

MyApp就是项目的布局入口了,类似于Wpf/windows里面的窗口。标注这整个外部的容器的形状

在这里插入图片描述
在这里插入图片描述
详细的请看官方教程

在这里插入图片描述
目前看下来是单向数据流的向下数据流。在React和Vue中,都是自顶向下的数据流。什么是数据流呢?在我看来,就是数据改变自动触发,自动传递的就是数据流。

为什么一般都是向下数据流呢,因为我们认为,父节点的数据是先生成,范围广,更准确的。就好像是从上流的水往下流一样,可以更能保证整个项目的稳定行。如果是向上数据流的话,那随意添加一个子节点都可能导致父节点发送改动。如果是双向数据流的话,会导致数据流动的方向不明确,难以维护。

那子节点又是怎么通知父节点的呢?一般都是通过函数回调的形式,就是手动通知父节点。相当于需要更加繁琐,明确的操作来保证父节点的数据稳定。

更新视图

更新视图需要用到notifyListeners,这个是用于通知视图的方法。在React和WPF中都是手动通知的,在Vue中是自动通知的。手动通知的好处就是可以操控。

注意:Dark有自己的命名规范,class大驼峰,类名和方法名都是小驼峰。

在这里插入图片描述

将[MyAppState]进行修改

//可通知视图修改的类
class MyAppState extends ChangeNotifier {
  //这个就相当于成员变量
  var current = WordPair.random();

  //手动声明回调函数,理论上来说,最好通过函数显性修改父节点属性
  void getNext(){

    current = WordPair.random();
    // 手动通知刷新视图元素
    notifyListeners();
  }
  //手动通知
  void notify(){
    notifyListeners();

  }
}

在这里插入图片描述

直接修改

    return Scaffold(
      body: Column(
        children: [
          Text('A random idea str:'),
          Text(appState.current.asLowerCase),
          //添加新的按钮
          ElevatedButton(
              onPressed: () {
                print('button click');
                //直接修改父节点属性
                appState.current = WordPair.random();
                //手动更新通知
                appState.notify();
                //上面两步等于下面一步,但是还是建议使用函数有限制的回调
                //appState.getNext();
              },
              child: Text('Next'))
        ],
      ),
    );

在这里插入图片描述

浅拷贝父节点数据

为了防止父节点的数据遭到随意的修改,我们这里使用浅拷贝来复刻父节点的数据

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //拿到父节点,由于父节点是单例,所以不需要别名
    var appState = context.watch<MyAppState>();
    //为了解决复杂的代码逻辑,在函数开头拿到数据,而不是直接对父节点的数据进行修改
    //这里是浅拷贝,不是深拷贝
    var pair  = appState.current;
    return Scaffold(
      body: Column(
        children: [
          Text('A random idea str:'),
          // Text(appState.current.asLowerCase),
          Text(pair.asLowerCase),
          //添加新的按钮
          ElevatedButton(
              onPressed: () {
                print('button click');
                //直接修改父节点属性
                // pair = WordPair.random();
                //手动更新通知
                // appState.notify();
                //上面是浅拷贝的修改,无法反馈到父节点
                appState.getNext();
              },
              child: Text('Next'))
        ],
      ),
    );
  }
}

思考

所以我们的节点应该都是这么挂的

  • MyApp + MyAppState
    • MyHomePage + appState=MyAppState,这里的appState都是向上一级的父节点属性

所以我现在的问题就是如果一个父节点挂载多个子节点,会如何。现在还不了解

修改布局

子节点重构

右键Text节点,Refactor->Extarct Flutter Widget

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

子节点布局重构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多次扩展布局

在Padding布局外侧添加Card布局

在这里插入图片描述
在这里插入图片描述

设置颜色主题

在这里插入图片描述

@override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);       // ← Add this.

    return Card(
      color: theme.colorScheme.primary,    // ← And also this.
      child: Padding(
        padding: const EdgeInsets.all(20),
        child: Text(pair.asLowerCase),
      ),
    );
  }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统--死锁

目录 说明使用互斥锁时死锁是如何发生的。 系统模型&#xff1a; 死锁的特性&#xff1a; 处理死锁的方法&#xff1a; 死锁的预防&#xff1a; 死锁避免&#xff1a; 说明使用互斥锁时死锁是如何发生的。 我们先来看一个例子&#xff1a; 当两列火车在十字路口逼近时&am…

linux忘记mysql的root密码,强制修改

1、登录linux后编辑mysql的配置文件&#xff1a;vi /etc/my.cnf 2、添加如下代码&#xff0c;表示跳过授权表登录mysql 编辑完成后&#xff0c;按Esc键&#xff0c;":wq"退出编辑并保存修改内容。 3、使用命令&#xff1a;service mysqld restart 重启mysql服务. …

【No.21】蓝桥杯组合数学|数位排序|加法计数原理|乘法计数原理|排列数|组合数|抽屉原理|小蓝吃糖果|二项式定理|杨辉三角|归并排序(C++)

组合数学 数位排序 【问题描述】 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如,2022 排在 409 前面, 因为 2022 的数位之和是 6,小于 409 的数位 之和 13。…

【Web应用技术基础】JavaScript(1)——案例:猜数字

上一个博客发了视频。这个博客因为不能插入视频&#xff0c;所以给大家一张一张截图的 点击“重新开始一局游戏” <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"…

Java类与对象:从概念到实践的全景解析!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、类的定义格式 在java中定义类时需要用到…

Spring: 在SpringBoot项目中解决前端跨域问题

这里写目录标题 一、什么是跨域问题二、浏览器的同源策略三、SpringBoot项目中解决跨域问题的5种方式&#xff1a;使用CORS1、自定 web filter 实现跨域(全局跨域)2、重写 WebMvcConfigurer(全局跨域)3、 CorsFilter(全局跨域)4、使用CrossOrigin注解 (局部跨域) 一、什么是跨域…

matlab 点云可视化(6)——点云按强度进行可视化

目录 一、功能概述1、算法概述2、主要函数二、代码示例三、结果展示四、参考链接本文由CSDN点云侠原创原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、功能概述 1、算法概述 点云按强度进行可视化 2、主要函数

Request和Response

Request&#xff08;请求&#xff09;&Response&#xff08;响应&#xff09; Request&#xff1a;获取请求数据 Response&#xff1a;设置响应数据 Request继承体系 1.Tomcat需要解析请求数据&#xff0c;封装为request对象&#xff0c;并且创建request对象传递到servic…

分治实现快速排序和归并排序

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 一.快速排序&#xff08;升序为例&#xff09; 思想&#xff1a;确定分界点x&#xff0c;将小于分界点的值放在分界点的左边&#xff0c;将大于分界定的值放在分界点的右边&#xff0c;再递归处理两边的左右区间。 步骤&am…

HR应用人才测评开展招聘,可以显著提升效率

某汽车零部件武汉有限公司诚聘库管员1名…… 孟X毅&#xff0c;男&#xff0c;29岁,市场营销专业,做过生产主管,求一份白班工作。 王X宸&#xff0c;女&#xff0c;22岁&#xff0c;有一年会计经验&#xff0c;求相似工作。 张汉X&#xff0c;男&#xff0c;31岁&#xf…

Python程序怎么打包成exe文件

前言 pyinstaller可以将.py文件打包成.exe可执行文件&#xff0c;即使别人的电脑上没有搭建Python环境&#xff0c;也是可以直接运行程序的。 pyinstaller安装 首先打开cmd&#xff0c;在里面输入下面这一行命令&#xff0c;回车即可。 pip install pyinstaller 我运行命令…

TR2 - Transformer模型的复现

目录 理论知识模型结构结构分解黑盒两大模块块级结构编码器的组成解码器的组成 模型实现多头自注意力块前馈网络块位置编码编码器解码器组合模型最后附上引用部分 模型效果总结与心得体会 理论知识 Transformer是可以用于Seq2Seq任务的一种模型&#xff0c;和Seq2Seq不冲突。 …

Echarts地图之——如何给地图添加外边框轮廓

有时候我们希望给地图外围加一圈边框来增加美感 但实际情况中&#xff0c;我们需要把国界的边框和各个省份属于国界的边框相吻合&#xff0c;否则就会造成两者看起来是错位的感觉 这就需要我们把echarts registerMap的全国省份json和国界边框json的坐标相一致。 这个json我们可…

WEPE系统安装纯净版window11教程(包含pe内系统安装方法)

目录 一.安装u盘启动盘 1.1制作安装系统引导盘 1.2下载保存windows镜像 1.3根据自己电脑品牌查询进入BIOS设置的方法 1.4我们成功进入了PE 二.重装系统 2.1遇到问题 2.2重新来到这个界面 三.PE中基本软件的作用 四.学习声明 今天不敲代码&#xff0c;今天来讲讲We P…

PetaLinux 去除自动获取 IP 地址

问题&#xff1a;系统启动的时候会自动检测 IP 地址&#xff0c;如不需要这个功能&#xff08;该过程需耗时十几秒&#xff09;。可以自定义 IP 地址&#xff0c;去掉这一步。 操作步骤如下&#xff1a; 所有命令均需在非管理员模式下执行 1. 初始化 PetaLinux 运行环境 运行…

LabVIEW车载轴承振动监测系统

LabVIEW车载轴承振动监测系统 随着汽车工业的快速发展&#xff0c;车用轴承的稳定性和可靠性对保障车辆安全运行越来越重要。目前&#xff0c;大多数车用轴承工作在恶劣的环境下&#xff0c;容易出现各种故障。开发了一种基于LabVIEW的车载轴承振动监测系统&#xff0c;提高车…

算法题:桃飘火焰焰,梨堕雪漠漠(Java贪心)

链接&#xff1a;桃飘火焰焰&#xff0c;梨堕雪漠漠 来源&#xff1a;牛客网 题目描述 在某游戏平台打折之际&#xff0c;EternityEternityEternity兴致勃勃地在该游戏平台上购买了nnn个不同的游戏&#xff0c;从1到nnn编号。 通过游览游戏论坛EternityEternityEternity确定…

# Apache SeaTunnel 究竟是什么?

作者 | Shawn Gordon 翻译 | Debra Chen 原文链接 | What the Heck is Apache SeaTunnel? 我在2023年初开始注意到Apache SeaTunnel的相关讨论&#xff0c;一直低调地关注着。该项目始于2017年&#xff0c;最初名为Waterdrop&#xff0c;在Apache DolphinScheduler的创建者…

LInux: fork()究竟是如何工作的?为何一个变量能够接受两个返回值?

LInux: fork函数究竟是如何工作的&#xff1f;为何一个变量能够接受两个返回值&#xff1f; 前言一、fork()用法二 、fork()应用实例展示三、fork()工作原理3.1 为什么要创建子进程&#xff1f;3.2 fork()究竟干了些什么&#xff1f;3.3 fork为什么会存在两个返回值&#xff1f…

文件上传漏洞-黑名单检测

黑名单检测 一般情况下&#xff0c;代码文件里会有一个数组或者列表&#xff0c;该数组或者列表里会包含一些非法的字符或者字符串&#xff0c;当数据包中含有符合该列表的字符串时&#xff0c;即认定该数据包是非法的。 如下图&#xff0c;定义了一个数组$deny_ext array(.a…