VsCode配置php开发环境
个人博客
http://www.milovetingting.cn
下载php1、在php官网选择相应的版本下载
https://windows.php.net/download#php-8.2
2、解压安装包,将解压后的目录路径加入环境变量PATH中
3、运行php -v
可以看到相应的php版本信息,环境变量配置成功。
下载VsCode
https://code.visualstudio.com/docs/?dv=win
下载完成后,双击安装
安装VsCode插件
测试1、新建目录,名称随意
2、用Vscode打开这个目录,然后新建hello.php文件,内容如下:
1<?php phpinfo() ?>
3、运行php server.在hello.php文件上右键,选择Reload Server
4、在弹出的浏览器上可以看到如下页面:
Dart利用注解生成代码
个人博客:http://www.milovetingting.cn
Dart利用注解生成代码引入依赖123dev_dependencies: source_gen: ^1.2.6 build_runner: '>2.3.0 <4.0.0'
定义注解123456789101112import 'package:meta/meta_meta.dart';///定义注解@Target({TargetKind.classType})class JsonGeneratorTest { final String name; final int age; const JsonGeneratorTest(this.name, this.age);}
解析注解12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656 ...
IDEA配置Live Templates
个人博客:http://www.milovetingting.cn
IDEA配置Live Templates1、Android Studio-Preferences-Editor-Live Templates,可根据实际情况选择,这里选择Dart和Live Template
2、设置模板信息
模板信息如下:
123factory $CLASS_NAME$.fromJson(Map<String,dynamic> json) => _$$$CLASS_NAME$FromJson(json);Map<String,dynamic> toJson() => _$$$CLASS_NAME$ToJson(this);
如果需要转义,在前面加$。这里的$CLASS_NAME$即为定义一个变量
编辑参数,点击Edit variables,在弹出的界面修改,这里需要获取类名,因此选择dartClassName()
配置生效范围
3、使用。输入gen后,IDEA即会出现提示,按Tab后,可以快捷生成代码。
Flutter引用阿里巴巴图标
个人博客:http://www.milovetingting.cn
Flutter引用阿里巴巴图标阿里巴巴图标下载1、打开网址:https://www.iconfont.cn/ 后登录帐号
2、在搜索栏搜索需要的图标
3、将搜索出来后的结果,加入到库中
4、点击如图所示位置
5、选择下载代码
6、解压下载回来的压缩包
定义图标1、在项目根目录下新建fonts文件夹
2、将解压后的ttf文件复制到fonts文件夹
3、配置pubspec.yaml,在flutter节点下增加
1234fonts: - family: IconFont fonts: - asset: fonts/iconfont.ttf
4、查看解压后的iconfont.json文件
5、新建一个工具类
12345678910import 'package:flutter/material.dart';class CustomIcons{ //和yaml中设置的family一致 static const String fontFamily = &qu ...
Flutter DevTools使用
个人博客:http://www.milovetingting.cn
Flutter DevTools使用进入Debug模式
打开Flutter DevTools
查看DevTools
Dart的Typedefs、元数据、注释
个人博客:http://www.milovetingting.cn
Typedefs类型别名是引用某一类型的简便方法,因为其使用关键字 typedef,因此通常被称作 typedef。下面是一个使用 IntList 来声明和使用类型别名的例子:
12typedef IntList = List<int>;IntList il = [1, 2, 3];
类型别名可以有类型参数:
123typedef ListMapper<X> = Map<X, List<X>>;Map<String, List<String>> m1 = {}; // Verbose.ListMapper<String> m2 = {}; // Same thing but shorter and clearer.
针对函数,在大多数情况下,我们推荐使用 内联函数类型 替代 typedefs。然而,函数的 typedefs 仍然是有用的:
1234567typedef Compare< ...
Dart生成器、可调用类、隔离区
个人博客:http://www.milovetingting.cn
生成器当你需要延迟地生成一连串的值时,可以考虑使用 生成器函数。Dart 内置支持两种形式的生成器方法:
同步 生成器:返回一个 Iterable 对象。
异步 生成器:返回一个 Stream 对象。
通过在函数上加 sync* 关键字并将返回值类型设置为 Iterable 来实现一个 同步 生成器函数,在函数中使用 yield 语句来传递值:
1234Iterable<int> naturalsTo(int n) sync* { int k = 0; while (k < n) yield k++;}
实现 异步 生成器函数与同步类似,只不过关键字为 async* 并且返回值为 Stream:
1234Stream<int> asynchronousNaturalsTo(int n) async* { int k = 0; while (k < n) yield k++;}
如果生成器是递归调用的,可以使用 yield* ...
Dart异步支持
个人博客:http://www.milovetingting.cn
异步支持Dart 代码库中有大量返回 Future 或 Stream 对象的函数,这些函数都是 异步 的,它们会在耗时操作(比如I/O)执行完毕前直接返回而不会等待耗时操作执行完毕。
async 和 await 关键字用于实现异步编程,并且让你的代码看起来就像是同步的一样。
处理 Future可以通过下面两种方式,获得 Future 执行完成的结果:
使用 async 和 await,在 异步编程 codelab 中有更多描述;
使用 Future API,具体描述参考 库概览。
使用 async 和 await 的代码是异步的,但是看起来有点像同步代码。例如,下面的代码使用 await 等待异步函数的执行结果。
1await lookUpVersion();
必须在带有 async 关键字的 异步函数 中使用 await:
1234Future<void> checkVersion() async { var version = await lookUpVersion(); ...
Dart库和可见性
个人博客:http://www.milovetingting.cn
库和可见性import 和 library 关键字可以帮助你创建一个模块化和可共享的代码库。代码库不仅只是提供 API 而且还起到了封装的作用:以下划线(_)开头的成员仅在代码库中可见。 每个 Dart 程序都是一个库,即便没有使用关键字 library 指定。
Dart 的库可以使用 包工具 来发布和部署。
如果你对 Dart 为何使用下划线而不使用 public 或 private 作为可访问性关键字,可以查看 SDK issue 33383。
使用库使用 import 来指定命名空间以便其它库可以访问。
比如你可以导入代码库 dart:html 来使用 Dart Web 中相关 API:
1import 'dart:html';
import 的唯一参数是用于指定代码库的 URI,对于 Dart 内置的库,使用 dart:xxxxxx 的形式。而对于其它的库,你可以使用一个文件系统路径或者以 package:xxxxxx 的形式。 package:xxxxxx 指定的库通过包管理器( ...
Dart泛型
个人博客:http://www.milovetingting.cn
泛型为什么使用泛型?泛型常用于需要要求类型安全的情况,但是它也会对代码运行有好处:
适当地指定泛型可以更好地帮助代码生成。
使用泛型可以减少代码重复。
比如你想声明一个只能包含 String 类型的数组,你可以将该数组声明为 List<String>(读作“字符串类型的 list”),这样的话就可以很容易避免因为在该数组放入非 String 类变量而导致的诸多问题,同时编译器以及其他阅读代码的人都可以很容易地发现并定位问题:
123var names = <String>[];names.addAll(['Seth', 'Kathy', 'Lars']);names.add(42); // Error
另一个使用泛型的原因是可以减少重复代码。泛型可以让你在多个不同类型实现之间共享同一个接口声明,比如下面的例子中声明了一个类用于缓存对象的接口:
1234abstract class ObjectCache { Obj ...