flutter笔记-hello dart

文章目录

  • 1. 搭建环境
  • 2. 运行官方首个程序
  • 3. AS中运行
    • iOS
    • Android
  • 语法简述
    • 1. 变量常量
      • 字符串补充
    • 2. 集合
    • 3. 函数
      • 关于可选报错:
      • 匿名函数
    • 4. 特殊运算符
    • 5. 类
  • dart 包

1. 搭建环境

环境的搭建在window和mac都差不多,都是从官网下载对应操作系统对应版本的SDK;
然后就是配置flutter下的bin到对应系统的环境变量,我这里是mac使用的zsh,配置.zshrc 或者.zsh_profile等文件我的配置如下:

 flutter 配置
export PUB_HOSTED_URL="https://pub.flutter-io.cn"
export FLUTTER_STORAGE_BASE_URL="https://storage.flutter-io.cn"
export FLUTTER_HOME=$HOME/dev/flutter
export PATH="$PATH:$FLUTTER_HOME/bin"
export PATH="$PATH:$FLUTTER_HOME/bin/cache/dart-sdk/bin"

2. 运行官方首个程序

flutter安装完毕后,创建一个工作目录,用来存放flutter项目;然后再当前目录执行 :

 flutter create hello_flutter 

关于包名,要求如下:

  • 包名应该全部小写just_like_this
  • 用下划线分隔单词
  • 仅使用基本拉丁字母和阿拉伯数字:[a-z0-9_]
  • 确保该名称是有效的 Dart 标识符——它不以数字开头,也不是保留字。
    如果出现大写就会出现下列错误:
"Hello_word" is not a valid Dart package name.The name should be all lowercase, with underscores to separate words,
"just_like_this".Use only basic Latin letters and Arabic digits: [a-z0-9_].Also,
make sure the name is a valid Dart identifier—that it doesn't start with digits
and isn't a reserved word.
See https://dart.dev/tools/pub/pubspec#name for more information.
Try "hello_word" instead.

其他注意事项见:https://dart.dev/tools/pub/pubspec#name

3. AS中运行

打开AS 选择打开已经存在的项目,选择文件,然后就可以在AS种编译了;

iOS

在AS中启动iOS模拟器要是启动设备,检查下默认xcode,因为我有多个xocde默认没有选择不是系统的所以云信iOS模拟器失败;AS中默认启动的是application下的xcode模拟器;可以使用命令:

 xcode-select -psudo xcode-select --s /Applications/Xcode.app/Contents/Developer

Android

Android studio运行官方demo出现以下错误:

Exception in thread “main” java.util.zip.ZipException: zip END header not found
...

通过在其官方的issue中找到错误原因:这个错误与 Gradle 有关,这个错误通常是由于 Gradle 设置损坏或不完整所导致的,解决步骤如下:

  • 转到用户根目录并找到隐藏.gradle文件夹并将其删除。
    如果您使用的是 Mac,请打开终端并执行
cd ~
rm -rf .gradle
  • 然后运行你的应用程序到 Android 模拟器或设备(Physical device),不要取消,并确保有稳定的互联网连接(国内可能需要…),在这时候AS将自动下载新的 Gradle;
  • 下载完成后,项目运行成功;如图:
    在这里插入图片描述

语法简述

1. 变量常量

在Dart中支持显示声明和类型推导,如下:

 // 显示声明String name = "Aman";// 类型推导var age = 20;// 可修改name = "Aman1";age = 21;print("name is ${name},age is ${age}");
  1. 常量
    有两种声明方式 final 和 const
/  finalfinal String add = "test";// add = "test1"; //不可修改// constconst String add1 = "test2";// add1 = "test3"; // 不可修改

这两个的区别是,const 必须赋值常量值,是要在编译期间确定的值;final可以是运行期间确定的值;如下:

 // final var timer = DateTime.now().millisecondsSinceEpoch;//推导类型不能用于 const和 finalfinal int timer = DateTime.now().millisecondsSinceEpoch;// const int timer1 = DateTime.now().millisecondsSinceEpoch;//const 必须是常量值const int timer2 = 3333;

在日常开发中常用final;例如:

class Person {String name;int age;Person(this.name, this.age);
}
final p = Person("Aman", 20);
final p1 = Person("Andy", 38);//这里2.0之前需要使用 const Person("Andy", 38)
print(identical(p, p1));
// false

其中identical使用与判断两个对象是否相等;
上面的实例也介绍其中的dart的类定义;
const示例:

const p_c = Person("LiSi",50); //这样报错:The constructor being called isn't a const constructor.const p_c1 = Person("VeLi", 58);print("const 比较:${identical(p_c, p_c1)}");// false

类需要修改:

class Person {final name;final age;const Person(this.name, this.age);
}

也就是要把构造器改成const的;通过上面的输出也能知道这样 写并不是单例;

需要注意的是dart中没有非空即真,也就是判断一个对象是否存在,需要明确的bool类型;例如:

  String name = "Aman";if (name) {}

会报错:Conditions must have a static type of 'bool'.

字符串补充

dart支持类似Python的多行字符串定义:

var str = """这里都是字符串""";print(str);

2. 集合

和大多数语言类似。这里直接看示例:

void main(List<String> args) {// 集合 list [] 字面量创建var name = ['a', 'b', 'c'];for (var item in name) {print(item);}// set {}字面量创建var set = {1, 2, 3, 4, 5};for (var element in set) {print(element);}// mapvar map = {'name': 'zhangsan','age': 18,'sex': '男',};for (var key in map.keys) {print(key);}
}

3. 函数

dart中不支持函数重载,参数有可选参数(位置可选参数和命名可选参数)和必传参数:
// 必传参数

testString(String name) {print(name);
}// 位置可选参数
testopt(String name, [int age = 0, double weight = 0.0]) {print(name);
}// 命名可选参数
TestsOpt1(String name, {int age = 0, double weight = 0.0}) {print(name);
}

调用:

testString("dddd");testopt("ddd", 4, 6.0);TestsOpt1("444", age: 1, weight: 9);

关于可选报错:

The parameter 'num' can't have a value of 'null' because of its type 'int', but the implicit default value is 'null'.
Try adding either an explicit non-'null' default value or the 'required' modifier. 

在这里插入图片描述

修改成这样:

int add(int a, int b, {String name = "", int num = 0}) {return a + b;
}

匿名函数

function是dart保留词,其使用如下:

testFun(Function f) {f("5454");
}
调用:
testFun((test) {print(test);});

注意Function是无参数的,在实例中是可以使用传参的所以一般使用如下:

typedef TestFunP = void Function(String name);
testFun1(TestFunP f) {f("5454");
}

4. 特殊运算符

dart中大部分的运算符和其他语言类似;

  • ??=使用如下:
   // 赋值运算符 当原来的变量不是空的时候才会赋值var name = "10";name ??= "123";print(name);
  • 级联运算符 …
   class Person {var name;var age;Person(this.name, this.age);run() {print("run:${this.name} ${this.age}");}eat() {print("eat:${this.name} ${this.age}");}
}var per = Person("ddd", 1)..name..run()..eat();

相当于类中函数的链式调用;

5. 类

语法和c++类似,有默认构造函数,如果有自定义构造函数那么就会覆盖默认构造函数;自定义构造函数与其他语言不同的是。类似上面实例的调用:

Person(this.name, this.age);

这种事dart的一种语法糖;

  • 由于Dart不支持函数重载;类似不同参数的构造实现可以使用**命名构造函数**;
   // 命名构造函数Person.withNameAgeWeight(this.name, this.age, this.weight);Person.fromMap(Map<String, dynamic> map) {this.name = map["name"];this.age = map["age"];this.weight = map["weight"];}
  • 类的初始化列表
  Person(this.name, {int age = 10}) : this.age = age ?? 10;

dart 包

上面使用的方法都是在dart/core中所以不用导入可以使用,其他库比如math库的导入方法如下:

import 'dart:math' show max, sqrt;//show 只引入库里面的某个方法, hide 不导入某个方法导入其他方法

一般情况下.dart就是一个包或者叫库;

第三方库的使用是通过yaml文件实现;
也就是新建pubspec.yaml中引入,具体格式见官方;
常用格式如下:

environment:sdk: ">=2.12.0 <3.0.0"flutter: ">=1.17.0"name: flutter_app
description: A new Flutter project.
dependencies:flutter:sdk: flutterhttp: ^1.2.1
  • 然后到yaml所在的目录执行 dart pub get 就会下载所有的这个库的依赖和这个库如图:
    *在这里插入图片描述

  • dart pub get这个命令执行完毕后会根据pubspec.yaml中配置的内容下载对应的包,并放置在系统缓存中(包括其依赖的所有包);

在Mac或者Linux系统中,这个缓存目录的地址是:~/.pub-cache,在windows中这个目录地址是:%LOCALAPPDATA%\Pub\Cache;也可以通过设置PUB_CACHE更改缓存地址;

  • 当下载完依赖包之后,dart会在 .dart_tool/目录中创建一个 package_config.json文件,用来表示当前项目和系统缓存包的映射关系。
    注意在3.0以后的版本使用dart需要如下导入库:
import 'package:http/http.dart' as http;

然后就可以按照官方的实例运行:

import 'dart:convert' as convert;
import 'package:http/http.dart' as http;void main(List<String> args) async {// This example uses the Google Books API to search for books about http.// https://developers.google.com/books/docs/overviewvar url =Uri.https('developers.google.com', '/books/v1/volumes', {'q': '{http}'});// Await the http get response, then decode the json-formatted response.var response = await http.get(url);if (response.statusCode == 200) {var jsonResponse =convert.jsonDecode(response.body) as Map<String, dynamic>;var itemCount = jsonResponse['totalItems'];print('Number of books about http: $itemCount.');} else {print('Request failed with status: ${response.statusCode}.');}
}

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

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

相关文章

某零售企业招聘管理体系搭建咨询项目

科学岗位分析&#xff0c;改善招聘流程&#xff0c;提高招聘及时率随着公司不断发展壮大&#xff0c;企业规模逐渐增大&#xff0c;部门设置也日益增多&#xff0c;因此对人员的需求也日益提高。但是目前该企业在人员招聘方面逐渐暴露出一些诸如岗位分析不到位、缺乏整体面试计…

开源博客项目Blog .NET Core源码学习(17:App.Hosting项目结构分析-5)

本文学习并分析App.Hosting项目中前台页面的作品展示页面和首页页面。 作品展示页面 作品展示页面总体上为上下布局&#xff0c;上方显示导航菜单&#xff0c;下方从左向右显示图片数据&#xff0c;支持放大查看图片和下载图片。整个页面使用了layui中的面包屑导航、弹出层、流…

强化学习2:Q-learning 算法

如果对强化学习没有了解&#xff0c;推荐先学习一下&#xff1a;强化学习基本原理 1 Q-Learning&#xff1a;简介 Q-Learning 是一种基于价值迭代的强化学习算法&#xff0c;用于解决马尔可夫决策过程&#xff08;MDP&#xff09;中的问题。在 Q-Learning 中&#xff0c;代理…

SAP DMS创建文档根目录操作简介

前面我们已经对DMS的后台进行了系统的配置,本文开始我们对DMS的前台操作进行说明 1、CV01N创建文档 注意:EDIPUBLICROOTFOLDER为根目录的凭证号,不允许更改。 输入好后回车。进入下图所示: 点击文档浏览器,进入下一屏如下图: 注意:点击创建新的私人文件夹按创建是创…

关于pdf.js中文本坐标尺寸的使用

一个电子教材项目中有这样一个需求&#xff1a; 用户向网站上传一个PDF书籍后&#xff0c;网站可以对PDF书籍进行解析&#xff0c;并支持用户对PDF书籍的每一页做一些操作&#xff0c;比如&#xff1a;为英语课本的单词和句子添加音频热区。因为热区数量很多&#xff0c;所以&a…

埋点,自己写插件,自己写的按钮埋点,掘金同款投递简历

20分钟掌握 Vite 插件开发 - 掘金 vite的生命周期啥的 1.浏览器的控制台输出有样式的字 // const randomLetterPlugin ()>{ // const letters [wwwwwww,000000000000,888888888888]; // //随机获取一个字符并打印 // const printRandomLetter ()>{ // …

PHP校验15位和18位身份证号

第十八位数字的计算方法为&#xff1a; 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分 别为&#xff1a;7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11&#xff0c;看余数是多少&#xff1f; 4…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

自定义数据 微调CLIP (结合paper)

CLIP 是 Contrastive Language-Image Pre-training 的缩写&#xff0c;是一个擅长理解文本和图像之间关系的模型&#xff0c;下面是一个简单的介绍&#xff1a; 优点&#xff1a; CLIP 在零样本学习方面特别强大&#xff0c;它可以&#xff08;用自然语言&#xff09;给出图像…

【深度学习】行人跌倒行为检测软件系统

行人跌倒检测系统在各个领域的应用都对社会的整体健康、安全和福祉产生积极影响&#xff0c;为人们的生活和工作提供了更加安全和可靠的环境&#xff0c; 本文主要使用YOLOV8深度学习框架自训练了一个“行人跌倒检测模型”&#xff0c;基于此模型使用PYQT5实现了一款界面软件用…

Visual Studio2022中使用水晶报表

1.创建水晶报表项目 选择需要的表 自动生成连接 选项:可跳过 后续还有一些 都能跳过 看你自己的需求 自己选的样式

39. 【Android教程】触摸事件分发

用户在使用 Andriod 系统的时候会不断的和我们的 App 进行各种类型的交互&#xff08;类似点击、滑动等等&#xff09;&#xff0c;“事件”就是一个非常有效的用来收集用户行为的方式。在前面章节有提到过&#xff1a;Android 系统采用一个先进先出&#xff08;FIFO&#xff0…

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

54、图论-实现Trie前缀树

思路&#xff1a; 主要是构建一个trie前缀树结构。如果构建呢&#xff1f;看题意&#xff0c;应该当前节点对象下有几个属性&#xff1a; 1、next节点数组 2、是否为结尾 3、当前值 代码如下&#xff1a; class Trie {class Node {boolean end;Node[] nexts;public Node(…

如何在PostgreSQL中使用索引覆盖扫描提高查询性能?

文章目录 解决方案1. 创建合适的索引2. 确保查询能够使用索引覆盖扫描3. 调整查询以利用索引覆盖扫描4. 监控和调优 示例代码1. 创建索引2. 编写查询3. 检查是否使用索引覆盖扫描4. 调整索引 总结 在PostgreSQL中&#xff0c;索引是提高查询性能的关键工具之一。索引允许数据库…

文章生成器免费版有哪些,哪个好用?

作为一个长期需要写作的人&#xff0c;对文章生成器自然是非常了解&#xff0c;如果搜文章生成器互联网上多到让人应接不暇&#xff0c;但小编今天要谈的是文章生成器免费版&#xff0c;因为看到很多写手朋友都想找一个免费的文章生成器来用&#xff0c;但是大家在网上搜可能很…

GITHUB的VB代码无法加载的问题解决

GITHUB里有不少好的VB代码&#xff0c;但是下载之后&#xff0c;经常出现工程加载出错的问题&#xff0c;例如&#xff1a; LOG文件为&#xff1a; 不能加载 0 行 0: 不能加载文件 D:\xxxx\Semi VB API Loader\frmMain.frm 。 原因其实很简单&#xff0c;github里的换行符是u…

Promise.all 的方法还没执行完就执行了.then

碰见一个问题&#xff0c;接盘了一个有问题的页面修改。 改变日期后 查询很多数据再去重新加载页面上的数据显示相关的组件。 问题就来了。 加载异常捏…… 最后我一通查&#xff1a; 重点来了 是因为这个Promise.all(数组)&#xff0c;里边这个数组的问题。现在是在数据中…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析&#xff1a;以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代&#xff0c;机器学习算法以其强大的数据处理和分析能力&#xff0c;成为…

Linux - tar (tape archive)

tar 的全称是 Tape Archive。它最初是在 Unix 系统中用于将数据写入磁带的工具&#xff0c;但现在它通常用于创建、维护、修改和提取文件的归档文件。尽管 tar 可以用于压缩和解压缩文件&#xff0c;但它本身并不进行压缩&#xff0c;而是通常与 gzip 或 bzip2 等压缩工具一起使…