Flutter学习笔记---flutter环境搭建以及dart语法的学习

news2024/9/22 23:31:05

Flutter笔记

Flutter环境搭建

获取 Dart SDK | Dart

dart-pub | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

Flutter、Dart SDK镜像资源 - 掘金 (juejin.cn)

Index of /flutter/dart-archive/channels/stable/release/3.2.6/sdk/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror


Flutter环境配置(window10环境) - 简书 (jianshu.com)

搞搞flutter,首先是环境配置,此前提是已经安装Android studio和对应的Android SDK。废话不多说,看具体步骤:

一,从如下地址下载对应的flutter SDK,点击如图下载最新版本sdk:

flutterSDK下载地址:https://flutter.dev/docs/get-started/install/windows

在这里插入图片描述

二,将sdk复制到系统盘并解压,位置随意。如下图所示

在这里插入图片描述

三,打开解压的flutter文件夹,找到bin,复制如下图地址

在这里插入图片描述

四,桌面找到 此电脑–>右击选择属性–>高级系统设置–>环境变量–>找到系统变量–>Path–>编辑–>新建–>粘贴第三步复制的地址–>点击确定保存

在这里插入图片描述

五,配置国内镜像。桌面找到 此电脑–>右击选择属性–>高级系统设置–>环境变量–>找到用户变量–>点击新建
FLUTTER_STORAGE_BASE_URL="https://mirrors.tuna.tsinghua.edu.cn/flutter"
PUB_HOSTED_URL="https://mirrors.tuna.tsinghua.edu.cn/dart-pub"

在这里插入图片描述

六,重启电脑
七,在桌面左下角输入cmd,打开命令提示符。输入 flutter doctor。检查配置项。如下图所示:

在这里插入图片描述

八,发现没有配置Android sdk,补充配置一下,找到用户变量,点击新建,如下图所示。
ANDROID_HOME=D:\AndroidSDK //该sdk地址是你安装Android studio的时候配置的sdk的地址

在这里插入图片描述

下图是Android studio中Android SDK的位置:

在这里插入图片描述

九,重新输入cmd,打开命令提示符,输入 flutter doctor,如下图所示:

在这里插入图片描述

十,出现感叹号! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses按照他说的 输入 flutter doctor --android-licenses,一路y下去即可。如下图所示:

在这里插入图片描述

重新输入 flutter doctor检查一下,如下图所示:表示只有Android studio的两个插件没有安装了。

在这里插入图片描述

十一,打开Android studio,安装dart和flutter两个插件重新运行flutter doctor 如下图:

在这里插入图片描述

都是绿色的小勾勾,表示安装成功。

十一,Android toolchain问题

网上许多教程可能flutter doctor 后直接就是下面的情况:

在这里插入图片描述

此时直接按提示运行flutter doctor --android-licenses 一路按y即可
但现在可没这么简单了,之前也提到过 在安装Android Studio过程中安装的Android sdk时不完整的,所以大多会是

在这里插入图片描述

在这里插入图片描述

根据您的错误提示,您需要进行以下两个步骤来解决Android工具链的问题:

  1. 安装 cmdline-tools 组件
    打开命令行,导航到你的Android SDK的 cmdline-tools 目录。如果尚未下载或安装,可以按照提示在SDK的tools目录下运行以下命令(请将 path/to/sdkmanager 替换为实际的sdkmanager路径):

    path/to/sdkmanager --install "cmdline-tools;latest"
    

    这将会安装最新的cmdline-tools组件。

  2. 接受 Android SDK 许可协议
    在命令行中运行以下Flutter命令以接受所有未接受的Android SDK许可:

    flutter doctor --android-licenses
    

    然后,当命令行列出所有许可时,按’y’键接受每个许可。

执行完上述步骤后,再次运行 flutter doctor 检查环境是否配置正确。如果一切顺利,关于Android工具链和许可证的状态问题应该会得到解决。

在这里插入图片描述

Android Studio设置国内镜像代理教程(HTTP Proxy)

Android Studio是在谷歌的服务器上,初次安装Android Studio时下载SDK等必定失败,由于国际环境原因,大陆是无法正常访问谷歌的,所以我们在使用Android Studio时需要设置HTTP Proxy 也就是网络代理,下面就来看看操作教程吧。

Android Studio设置HTTP Proxy

1.首次打开会自动弹出HTTP Proxy的设置项,如果没有请进入主界面后点击:File→Settings…→System Settings → HTTP Proxy(或者按快捷键:Ctrl+Alt+S,然后依次找到System Settings → HTTP Proxy)

2.打开后按下图,也就是选中“Auto-detect proxy settings”,勾选下方“Automatic proxy configuration URL”,填入国内的某个镜像站。

3.这里,我选择的是如下镜像站

mirrors.aliyun.com:80

4.配置完成后,就可以使用了,其他镜像站请参考下方的“Android SDK在线更新镜像服务器”。

1.阿里云镜像站地址:

mirrors.aliyun.com 端口:80

2.清华大学镜像站地址:

mirrors.tuna.tsinghua.edu.cn 端口:80

3.北京外国语大学镜像站地址:

mirror.bfsu.edu.cn 端口:80

4.中国科学院开源协会镜像站地址:

IPV4/IPV6: mirrors.opencas.cn 端口:80IPV4/IPV6: mirrors.opencas.org 端口:80IPV4/IPV6: mirrors.opencas.ac.cn 端口:80

5.上海GDG镜像服务器地址:

sdk.gdgshanghai.com 端口:8000

6.北京化工大学镜像服务器地址:

IPv4: ubuntu.buct.edu.cn/ 端口:80IPv4: ubuntu.buct.cn/ 端口:80IPv6: ubuntu.buct6.edu.cn/ 端口:80

7.大连东软信息学院镜像服务器地址:

mirrors.neusoft.edu.cn 端口:80

8.腾讯Bugly 镜像:

android-mirror.bugly.qq.com 端口:8080


来源:https://www.jianshu.com/p/fc97fccdf578

Android Studio 国内镜像代理设置(如果设置之后还是远程仓库下载失败,请仔细阅读其内容就可以解决了)-CSDN博客

Android Studio 配置flutter开发环境教程(超详细)_flutter config–android sdk-CSDN博客

使用Android Studio创建项目

  1. 安装flutter插件

    点击pugins直接搜索flutter然后install即可,它会提示此插件依赖dart,直接确定就好
    装好后确定就会回到创建项目页面

在这里插入图片描述

在这里插入图片描述

点击第二项创建flutter project点击next后就是项目配置:

在这里插入图片描述

在这里插入图片描述

dart语言

as关键字

在Dart语言中,as关键字有多种用法:

  1. 类型转换

    • 当你想要将一个对象显式地转换为另一种类型时,可以使用 as 关键字。如果转换是安全的(即目标类型与源类型兼容或者源对象实际上是目标类型的实例),则转换会成功;否则,如果转换失败,则在运行时会抛出 TypeError 异常。

      dynamic value = "Hello";
      String strValue = value as String; // 安全转换,因为value实际是一个String。
      int intValue = value as int; // 不安全转换,如果执行此行代码会抛出TypeError,因为字符串不能直接转换为整数。
      
  2. 库前缀导入

    • 在Dart中,当两个或多个库中有同名的顶级标识符冲突时,可以使用 as 来给导入的库指定别名,以此来避免名称冲突。

      import 'package:lib1/my_library.dart' as lib1;
      import 'package:lib2/my_library.dart' as lib2;
      
      void main() {
        lib1.MyClass classFromLib1 = lib1.MyClass();
        lib2.MyClass classFromLib2 = lib2.MyClass();
      }
      
  3. 异步流(Stream)中的类型过滤

    • 在处理异步数据流时,可以使用 .cast() 方法配合 as 进行类型转换,确保流中的事件符合特定类型。

      Stream<Object> objectStream = ...;
      Stream<String> stringStream = objectStream.cast<String>();
      
  4. 泛型类和方法中

    • 类型参数上下文中不直接使用 as 关键字,但在类型推断和类型约束中,它可能隐含地用于指示类型转换。

注意:对于异步编程,Dart 使用 asyncawait 关键字而不是 as,这些关键字与异步函数定义以及等待异步操作完成相关联。

dynamic关键字

在Dart语言中,dynamic 是一种类型注解,它表示变量可以持有任何类型的值。当你声明一个变量为 dynamic 类型时,编译器不会对该变量进行类型检查,这给予了你更大的灵活性,但也意味着可能在运行时出现类型错误。

例如,在Dart中:

dynamic value;

value = 42; // 正确,因为整数是合法的Dart对象
value = "Hello"; // 正确,字符串也是合法的Dart对象
value.callSomeMethod(); // 运行时如果value不是一个具有callSomeMethod方法的对象,则会抛出异常

// 在Dartz库的上下文中,
// dynamic 可能用于表示函数式编程中的某种泛型或不特定类型的数据结构,
// 但在Dartz库本身并不直接定义或使用特殊的 dynamic 类型概念。

在与Dartz库相关的函数式编程场景下,虽然Dartz通常鼓励静态类型以确保类型安全,但如果你将Dart的 dynamic 类型用于Dartz库的数据结构如 Maybe<dynamic>Either<dynamic, String> 等,那么这些数据结构将会允许存储任意类型的值,但这会牺牲掉静态类型带来的诸多优势,包括编译时错误检测和IDE智能提示等。

判空运算符—?、??、??=

在Dart语言中,用于空值处理的运算符包括:

  1. 条件成员访问运算符 ?.:

    • 当尝试访问可能为 null 的对象的属性或方法时使用。

      var person = maybeNullPerson; // 可能是 null
      var name = person?.name; // 如果 person 为 null,则 name 也为 null,否则访问 person.name
      

      这个运算符会安全地返回 null 而不是抛出异常。如果链式调用中的任何一个点为 null,则整个表达式将短路并返回 null

  2. 空合并运算符 ??:

    • 当需要提供一个默认值以防止 null 值时使用。

      String nullableString;
      String nonNullableString = nullableString ?? "default value"; 
      

      如果 nullableString 为非 null,那么 nonNullableString 将等于 nullableString 的值;如果 nullableStringnull,则 nonNullableString 将被赋予 “default value”。

  3. 空合并赋值运算符 ??=:

    • 只有当变量为 null 时才进行赋值操作。

      String? possiblyNullVar;
      possiblyNullVar ??= "initialized on demand";
      

      在这个例子中,只有当 possiblyNullVarnull 时,才会执行 possiblyNullVar = "initialized on demand"。如果 possiblyNullVar 已经有一个非 null 的值,此运算符什么都不会做,保持原值不变。

这些运算符都是 Dart 空安全特性的一部分,旨在帮助开发者编写更安全、简洁的代码,避免因意外的 null 引发运行时错误。

switch…case

在Dart语言中,switch...case 语句用于基于表达式的值执行不同的代码块。以下是 switch...case 的基本用法:

// 声明一个变量或表达式
var someValue = ...; // 可以是整数、字符、枚举或其他允许的类型

switch (someValue) {
  case value1:
    // 当 someValue 等于 value1 时执行这里的代码
    statements1;
    break; // 如果需要在执行完statements1后立即跳出switch结构,则使用break

  case value2:
    // 当 someValue 等于 value2 时执行这里的代码
    statements2;
    break;

  // 可以有任意数量的case子句
  ...

  default:
    // 当 someValue 不等于任何一个case标签的值时执行这里的代码
    defaultStatements;
    break; // 在default分支中使用break也是可选的,因为默认情况下会在这里停止执行switch结构
}

// switch 结构结束后的其他代码
...

注意事项:

  • switch 表达式的结果必须是整数、字符串(从 Dart 2.3 版本开始支持)、或者实现了 == 运算符和 hashCode 方法的对象。
  • 每个 case 子句后面跟着一个要匹配的常量表达式。
  • 执行流程会进入第一个与 switch 表达式结果相等的 case 分支,并执行该分支中的代码。
  • 使用 break 关键字来终止当前 case 分支的执行并跳出整个 switch 结构。如果没有 break,控制流将“贯穿”到下一个 case 子句,直到遇到 break 或到达 switch 结束为止。
  • default 子句是可选的,用于提供一个当所有 case 都不匹配时的默认行为。

Class

您提供的Dart代码片段定义了一个名为 Cat 的类,但是缺少了构造函数来初始化实例的属性。在Dart中,如果你不提供任何构造函数,编译器会自动生成一个无参数的默认构造函数。然而,一旦类中有可nullable的非final字段(如您的 nameage),默认构造函数不会给它们赋予初始值,所以在创建 Cat 实例时这些字段将是未初始化的。

为了让这个类能正确实例化并赋初值,您可以添加一个构造函数:

class Cat {
  String name;
  int age;

  // 添加构造函数以初始化成员变量
  Cat(this.name, this.age);
}

现在当你创建 Cat 类的实例时,需要传递 nameage 的初始值:

var myCat = Cat('Mittens', 3); // 创建一个名字为'Mittens'、年龄为3岁的猫实例

当然,如果您希望 nameage 在没有传入值时有默认值,可以这样定义构造函数:

class Cat {
  String name;
  int age;

  // 添加构造函数,并设置默认值
  Cat({this.name = '未知', this.age = 0});
}

这样即使不传递参数也能创建 Cat 实例,并且其 nameage 将分别默认为 '未知'0

类的构造方法

您提供的代码中包含了两种不同的构造方法(构造函数):

  1. 带有初始化逻辑的构造函数:
Cat(String name, int age) {
  this.name = name; // 使用 'this' 关键字来明确指定当前实例的属性
  this.age = age;
}

在这个构造函数中,通过传入的 nameage 参数直接初始化了实例的同名属性。这种方式下,即使成员变量使用了 late 关键字,也会在构造函数执行时立即赋值。

  1. 初始化列表构造函数:
Cat(this.name, this.age);

这个构造函数是简化的构造器语法,它使用了初始化列表。当参数名与类中的属性名相同时,可以直接用 this. 的形式来引用它们,并且会自动完成对相应属性的初始化。在这种情况下,由于我们已经提供了初始值,所以对于 late 类型的属性来说也是安全的,它们会在构造过程中被初始化。

结论:这两种构造函数都可以用来正确地初始化带有 late 关键字的 nameage 属性。在实际开发中,如果不需要额外的初始化逻辑,通常更倾向于使用第二种简洁的初始化列表构造函数。

import用法

在Dart中,import 关键字用于导入其他库或源文件中的类、函数或其他定义。以下是 import 的基本用法:

  1. 基本导入

    import 'package:example_package/example_file.dart';
    

    这种形式用于导入 pub(Dart的包管理器)依赖或者项目内的库。这里的 'package:example_package/example_file.dart' 表示要导入的文件路径。

  2. 导入并指定别名

    import 'package:example_package/example_file.dart' as myAlias;
    

    当需要给导入的库或文件指定一个别名以避免命名冲突时使用此语法。例如,在上面的例子中,你可以通过 myAlias 来引用导入文件中的所有内容。

  3. 仅导入部分内容

    import 'package:example_package/example_file.dart' show MyClass, MyFunction;
    

    使用 show 关键字可以指定只导入指定的类或函数等符号。在上述例子中,只会导入 MyClass 类和 MyFunction 函数。
    或者

    import 'package:example_package/example_file.dart' hide MyClass;
    

    使用 hide 关键字可以排除指定的类或函数等符号。这意味着除了 MyClass 之外,example_file.dart 中的所有其他内容都会被导入。

  4. deferred import(延迟加载导入):

    import 'package:example_package/example_file.dart' deferred as myDeferredImport;
    

    延迟加载导入会在运行时而不是编译时加载库,通常用于大型库以提高应用启动速度。在使用这些库之前,需要通过 .loadLibrary() 方法来加载它们。

  5. 混合使用 show 和 hide

    import 'package:example_package/example_file.dart'
        show MyClass, AnotherClass, hide MyFunction;
    

    同时使用 showhide 可以更精细地控制导入的内容。

注意:对于 Dart SDK 内置的库,可以直接导入,如:

import 'dart:math'; // 导入Dart内置的数学库

枚举类

在Dart语言中,枚举(Enum)是一种特殊的类,用于定义一组命名的、预定义的常量值。枚举可以为这些常量提供有意义的名称,并且每个枚举值都有一个索引和唯一标识。

创建枚举的基本语法如下:

enum Color { 
  red, 
  green, 
  blue 
}

在这个例子中,Color 是枚举类型的名字,而 redgreenblue 是该枚举类型的三个实例或成员。

每个枚举值都有一个默认索引,从0开始自动递增。例如,red 的索引是 0,green 的索引是 1,blue 的索引是 2。可以通过 .index 属性获取枚举值的索引:

int redIndex = Color.red.index; // redIndex 将会是 0

此外,你可以访问枚举的当前值:

Color myColor = Color.green;
print(myColor); // 输出: Color.green

如果需要自定义枚举值对应的字符串或者其他数据,可以给枚举成员指定一个值:

enum Color {
  red('红色'),
  green('绿色'),
  blue('蓝色');

  final String description;

  Color(this.description);

  String get value => description;
}

void main() {
  print(Color.red.value); // 输出: 红色
}

在这个例子中,我们为每个颜色枚举添加了一个描述字段,并提供了获取描述的方法 value

【dart相关问题】

有问题。

/// 可选位置参数---用[]包裹
void insertUser1(int id, String name, [int age]) {
  String intro = "id:$id,name:$name";
  if age:
    intro = intro+"age:$age";
  print(intro);
}

这段代码中存在几个问题:

  1. 可选位置参数的定义是正确的,但调用时需要在括号内指定或者省略。[int age] 表示 age 是一个可选的位置参数,默认值为 null

  2. 在条件判断中使用了变量 age 而不是 if (age != null)if (age != null && age != '')(如果考虑空字符串的情况)来检查 age 是否有值。

修正后的代码应该是这样:

void insertUser1(int id, String name, [int age]) {
  String intro = "id:$id,name:$name";

  if (age != null) { // 检查 age 是否有非 null 值
    intro += ",age:$age"; // 使用 += 连接字符串而非 +
  }

  print(intro);
}

现在,当你调用 insertUser1(1, 'John') 时,不会包含年龄信息;而调用 insertUser1(1, 'John', 30) 时,则会打印出带有年龄信息的结果。

【error】 06-function.dart:30:44: Error: The parameter 'age' 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. void insertUser1(int id, String name, [int age]) { ^^^

我明白了,Dart 2.12 版本引入了空安全特性,并在 Dart 2.13 版本默认开启。这意味着 int 类型的参数不能为 null,但你提供的可选参数 age 没有指定非 null 的默认值。

要解决这个问题,请根据你的需求选择以下任一方式:

  1. 如果 age 参数可以是 null 并且希望保持其为可选参数,则将其类型更改为 int?
void insertUser1(int id, String name, [int? age]) {
  String intro = "id:$id,name:$name";

  if (age != null) {
    intro = "$intro,age:$age";
  }

  print(intro);
}
  1. 如果 age 参数必须提供一个非 null 值,则移除方括号并添加 required 关键字:
void insertUser1(int id, String name, required int age) {
  String intro = "id:$id,name:$name,age:$age";
  print(intro);
}

现在,无论是哪种情况,代码都不会报错,并且符合 Dart 的空安全规范。

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

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

相关文章

优思学院|质量管理方面的证书有哪些?

在这个迅速变化的时代&#xff0c;每个行业都在寻找方法来提高效率、质量和生产力。 对于那些刚踏入或有兴趣深入探索质量管理领域的朋友们来说&#xff0c;一个常见的疑问浮现&#xff1a;为了提升自己的专业技能和职业前景&#xff0c;应该考取哪些证书&#xff1f; 在这方…

OS---python中OS模块的相关学习总结

介绍 在Python中&#xff0c;os模块是一个与操作系统交互的标准库&#xff0c;提供了许多用于文件和目录操作、进程管理、环境变量等功能。下面是os模块中一些常用的功能和方法&#xff1a; 用法 1.查看os模块内容(import os print(dir(os)) ) 结果如下&#xff1a; [Dir…

Windows客户端漏洞挖掘(红队角度)

0x01 前言 周五的时候看了key佬的演讲受益良多呀&#xff0c;来水水&#xff0c;写下目前针对Windows客户端类程序的部分挖掘入口吧&#xff0c;然后分享一下随手挖的很简单很简单的案例。 传统客户端 监听类的: 这里说的监听类的&#xff0c;指的就是安装客户端后启动的端口…

爬虫练习:获取某招聘网站Python岗位信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(拉钩Python岗位数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [公司, 规模,岗位,地区,薪资,经验要求]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer…

Halcon绘制图形

1、ROI是Halcon中的一个很重要的概念&#xff0c;为了减少计算量&#xff0c;只关注待检测物体或该物体周围的一片区域即可(类似于图片裁剪) * ROI是Halcon中的一个很重要的概念&#xff0c;为了减少计算量&#xff0c;只关注待检测物体或该物体周围的一片区域即可&#xff0c…

嵌入式方向还有希望吗?

我刚开始学习&#xff0c;也不知道我定位的是单片机工程师&#xff0c;嵌入式工程师职位的。 我只知道电子工程师&#xff0c;这个职位其实偏硬件&#xff0c;很多岗位需求是硬件设计&#xff0c;PCB设计&#xff0c;还要懂焊接、各种仪器仪表使用&#xff0c;还有些需要懂单片…

[Redis]——主从同步原理(全量同步、增量同步)

目录 Redis集群&#xff1a; 主从同步原理&#xff1a; replid和offset: 全量同步和增量同步&#xff1a; repl_baklog文件&#xff1a; 主从集群的优化&#xff1a; Redis集群&#xff1a; 部署多台Redis我们称之为Redis集群&#xff0c;他有一个主节点(负责写操作)&…

List(CS61B学习记录)

问题引入 上图中&#xff0c;赋给b海象的weight会改变a海象的weight&#xff0c;但x的赋值又不会改变y的赋值 Bits 要解释上图的问题&#xff0c;我们应该从Java的底层入手 相同的二进制编码&#xff0c;却因为数据类型不同&#xff0c;输出不同的值 变量的声明 基本类型…

【数据结构和算法初阶(C语言)】栈的概念和实现(后进先出---后来者居上的神奇线性结构带来的惊喜体验)

目录 1.栈 1.1栈的概念及结构 2.栈的实现 3.栈结构对数据的处理方式 3.1对栈进行初始化 3.2 从栈顶添加元素 3.3 打印栈元素 3.4移除栈顶元素 3.5获取栈顶元素 3.6获取栈中的有效个数 3.7 判断链表是否为空 3.9 销毁栈空间 4.结语及整个源码 1.栈 1.1栈的概念及结构 栈&am…

电力运维物联网平台

我们构建软硬件结合的生态系统&#xff0c;打造电力设备9物联平台&#xff0c;实现软件、硬件、平台、云数据一体化。 在硬件领域通过自主研发推出了一系列电力领域的硬件设备&#xff0c;包括:智能电力测控终端、智能电力采集终端等产品。在软件领域&#xff0c;我们搭…

韩国大带宽服务器的数据中心位置

很多用户会选择韩国大宽带服务器&#xff0c;那么韩国大带宽服务器的数据中心位置在哪&#xff0c;rak小编为您整理发布韩国大带宽服务器的数据中心位置。 韩国大带宽服务器的数据中心通常位于**首尔及其周边地区**。 韩国因其地理位置的优势&#xff0c;拥有丰富的网络带宽资源…

【智能算法】白鲨算法(AVOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2022年&#xff0c;Braik 等人受到白鲨捕食行为启发&#xff0c;提出了非洲秃鹫优化算法(White Shark Optimizer, WSO)。 2.算法原理 2.1算法思想 海洋中白鲨拥有敏锐的感知、听觉和嗅觉&#xf…

【竞技宝】LOL:sheer对位压制369 JDG鏖战三局力克TES

北京时间2024年3月15日,英雄联盟LPL2024春季常规赛继续进行,昨日共进行三场比赛,第三场比赛由TES对阵JDG。本场比赛前两局双方战至1-1平,决胜局JDG前期就打出完美节奏,中期两次团灭TES后轻松取胜,最终JDG鏖战三局击败TES。以下是本场比赛的详细战报。 第一局: TES:鳄鱼、盲僧、…

九千元家用投影仪怎么样:当贝X5 Ultra万元内天花板配置

投影仪市场正在最贱扩大&#xff0c;越来越的投影品牌纷纷加入市场&#xff0c;一方面可以促成市场的发展&#xff0c;但是宁一方面&#xff0c;市场的乱象也在不断扩大。对于数码新手来说选择一款适合的投影仪变成了一件难事&#xff0c;太多的品牌和产品不知道该如何选择&…

L1-5 猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子&#xff0c;有的是黑色的&#xff0c;有的是黄色的。每个人可以看到别人头上的帽子&#xff0c;但是看不到自己的。游戏开始后&#xff0c;每个人可以猜自己头上的帽子是什么颜色&#xff0c;或者可以弃权不猜。如果没有…

非常有用的Python 20个单行代码

有用的 Python 单行代码片段&#xff0c;只需一行代码即可解决特定编码问题&#xff01; 在本文中&#xff0c;云朵君将分享20 个 Python 一行代码&#xff0c;你可以在 30 秒或更短的时间内轻松学习它们。这种单行代码将节省你的时间&#xff0c;并使你的代码看起来更干净且易…

数码管动态扫描显示

摸鱼记录 Day_16 (&#xff9f;O&#xff9f;) review 前边已经学习了&#xff1a; 串口接收&#xff1a;Vivado 串口接收优化-CSDN博客 1. 今日摸鱼任务 串口接收数据 并用数码管显示 (&#xff9f;O&#xff9f;) 小梅哥视频&#xff1a; 17A 数码管段码显示与动态扫…

06. Redis架构-哨兵

简介 什么是哨兵 Redis的主从模式下&#xff0c;主节点一旦发生故障便不能提供服务&#xff0c;需要人工干预。手动将从节点晋升为主节点&#xff0c;同时还需要修改客户端配置。 Sentinel&#xff08;哨兵&#xff09;架构解决了Redis主从人工干预的问题。 Redis Sentinel是…

《鸟哥的Linux私房菜》第6章——总结与习题参考答案

目录 一、 简介 二、一些新了解的指令 1.touch- 修改文件时间或创建新文件 2.umask-新建文件/目录的默认权限 3.文件隐藏属性 4.文件特殊权限 5.file-观察文件类型 三、简答题部分 一、 简介 本章介绍了一些常用的文件与目录指令&#xff0c;包括新建/删除/复制/移动/查…

Spring Cloud Alibaba微服务从入门到进阶(一)(SpringBoot三板斧、SpringBoot Actuator)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点&#xff0c;加上以下配置&#xf…