Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
目录
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
一、简单介绍
二、在同一个布局中同时显示 Android 和 Flutter 界面 的实现原理
1. Flutter 的嵌入机制
2. FlutterEngine 的作用
3. FlutterView 的工作原理
4. FlutterFragment 的工作原理
三、简单效果预览
四、案例简单实现步骤
五、关键代码
一、简单介绍
Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。
Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。
二、在同一个布局中同时显示 Android 和 Flutter 界面 的实现原理
在同一个布局中同时显示 Android 和 Flutter 界面的实现原理主要基于 Flutter 提供的嵌入机制,允许 Flutter 内容以视图的形式嵌入到原生 Android 布局中。以下是其实现原理的详细解释:
1. Flutter 的嵌入机制
Flutter 提供了两种主要方式将 Flutter 内容嵌入到原生 Android 应用中:
-
FlutterView:这是一个原生的 Android 视图,用于显示 Flutter 内容。
-
FlutterFragment:这是一个 Android Fragment,用于将 Flutter 内容嵌入到 Android 的 Fragment 管理系统中。
这两种方式的核心是通过 FlutterEngine
来运行 Flutter 的 Dart 代码,并将渲染结果绘制到一个原生的 Android 视图中。
2. FlutterEngine 的作用
FlutterEngine
是 Flutter 提供的一个核心组件,用于初始化和运行 Flutter 的 Dart 代码。它负责以下任务:
-
加载 Dart 代码:从 APK 或其他资源中加载 Dart 文件,并执行 Dart 入口点(通常是
main()
函数)。 -
管理渲染线程:负责将 Flutter 的渲染内容绘制到原生视图中。
-
处理平台通道通信:通过
MethodChannel
和EventChannel
实现 Flutter 和原生代码之间的通信。 -
管理生命周期:与 Android 的生命周期(如
onPause
、onResume
)同步,确保 Flutter 内容在合适的时机进行渲染和暂停。
3. FlutterView 的工作原理
FlutterView
是一个原生的 Android 视图,用于显示 Flutter 内容。它的实现原理如下:
-
创建 FlutterEngine:在 Android 代码中创建一个
FlutterEngine
实例,并将其与FlutterView
关联。 -
绑定 Dart 代码:通过
FlutterEngine
加载 Dart 代码,并指定 Dart 的入口点(通常是main()
函数)。 -
渲染 Flutter 内容:
FlutterView
会接收来自 Flutter 引擎的渲染指令,并将其绘制到视图中。Flutter 引擎会将渲染内容转换为 OpenGL 或 Skia 的绘图命令,并通过FlutterView
的Surface
或TextureView
进行渲染。
4. FlutterFragment 的工作原理
FlutterFragment
是一个 Android Fragment,用于将 Flutter 内容嵌入到 Android 的 Fragment 管理系统中。它的实现原理如下:
-
创建 FlutterEngine:与
FlutterView
类似,FlutterFragment
也需要一个FlutterEngine
实例来运行 Dart 代码。 -
生命周期管理:
FlutterFragment
会根据 Android 的 Fragment 生命周期(如onCreate
、onResume
)管理 Flutter 引擎的生命周期,确保 Flutter 内容在合适的时机进行初始化和销毁。 -
视图嵌入:
FlutterFragment
内部会创建一个FlutterView
,并将 Flutter 内容渲染到该视图中。通过 Fragment 的onCreateView
方法,将FlutterView
返回给 Android 系统,从而实现 Flutter 内容的嵌入。
三、简单效果预览
四、案例简单实现步骤
1、在 Android Studio 中创建一个 Flutter 工程
2、选择创建 一个 Flutter Module
3、编写一个简单的 Flutter 界面
4、先再创建一个 Android 工程
5、回到 Flutter 工程,进行 Flutter - Build AAR 编译
6、编译完成后, 会有提示如何在 Android 工程中引用
7、在 Android 工程中,根据提示,在 settings.gradle 和 build.gradle 添加如下的提示内容
8、在 activity_main.xml 中添加一个 按钮,用来调起 Flutter 界面
9、在 MainActivity 中 引入 Flutter 相关,并实现点击 按钮 唤起 Flutter 界面的代码
10、在 AndroidManifest.xml 中,添加 FlutterActivity 相关属性
11、打包运行,简单效果如下
五、关键代码
1、main.dart
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo', // 设置应用的标题,显示在系统任务栏或窗口标题中theme: ThemeData(primarySwatch: Colors.blue, // 设置应用的主题颜色,这里使用蓝色作为主色调),home: MyHomePage(), // 设置应用的初始页面为 MyHomePage);}
}class MyHomePage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold( // 使用 Scaffold 提供一个基本的页面布局结构appBar: AppBar( // 添加一个应用栏(AppBar)作为页面的顶部导航title: Text('Flutter Module in Android'), // 设置应用栏的标题),body: Center( // 设置页面的主体内容child: Text('Hello from Flutter!'), // 在页面中心显示一条文本消息),);}
}
2、MainActivity.java
package com.example.test_android_embedding_flutter_0428;import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;import io.flutter.embedding.android.FlutterFragment;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.FlutterEngineCache;
import io.flutter.embedding.engine.dart.DartExecutor;public class MainActivity extends AppCompatActivity {private FlutterEngine flutterEngine; // 用于运行 Flutter Dart 代码的核心引擎@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); // 设置当前 Activity 的布局文件// 初始化 FlutterEngine// 创建一个 FlutterEngine 实例,用于运行 Flutter 的 Dart 代码flutterEngine = new FlutterEngine(this);// 执行 Dart 入口点,默认是 main() 函数flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());// 将 FlutterEngine 实例缓存到 FlutterEngineCache 中// 这样可以在需要时快速复用,避免重复初始化FlutterEngineCache.getInstance().put("my_flutter_engine", flutterEngine);// 获取按钮并设置点击事件findViewById(R.id.button).setOnClickListener(v -> {// 创建 FlutterFragment 实例// FlutterFragment 是一个 Android Fragment,用于嵌入 Flutter 界面FlutterFragment flutterFragment = FlutterFragment.createDefault();// 开始一个 Fragment 事务FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();// 将 FlutterFragment 替换到布局中的 FrameLayout 容器中// R.id.fl_container 是布局文件中定义的 FrameLayout 的 IDtransaction.replace(R.id.fl_container, flutterFragment);// 提交事务,使 Flutter 界面显示出来transaction.commit();});}
}
代码注释说明
FlutterEngine 的初始化
new FlutterEngine(this)
:创建一个FlutterEngine
实例,用于运行 Flutter 的 Dart 代码。
executeDartEntrypoint
:指定 Dart 的入口点,默认是main()
函数。这是 Flutter 应用的起点。
FlutterEngineCache.getInstance().put("my_flutter_engine", flutterEngine)
:将初始化好的FlutterEngine
缓存起来,以便后续复用。这可以避免重复初始化 Flutter 引擎,提高性能。按钮点击事件
findViewById(R.id.button)
:通过 ID 获取布局中的按钮。
setOnClickListener
:为按钮设置点击事件监听器。
FlutterFragment.createDefault()
:创建一个默认的FlutterFragment
实例。FlutterFragment
是一个 Android Fragment,用于嵌入 Flutter 界面。
getSupportFragmentManager().beginTransaction()
:开始一个 Fragment 事务,用于管理 Fragment 的添加、替换等操作。
transaction.replace(R.id.fl_container, flutterFragment)
:将FlutterFragment
替换到布局中的FrameLayout
容器中。R.id.fl_container
是布局文件中定义的容器 ID。
transaction.commit()
:提交事务,使 Flutter 界面显示出来。
3、activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 定义一个按钮,点击后会显示 Flutter 界面 --><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="打开 Flutter 界面" /><!-- 定义一个 FrameLayout 作为容器,用于嵌入 Flutter 界面 --><FrameLayoutandroid:id="@+id/fl_container"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" />
</LinearLayout>
4、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Test_Android_Embedding_Flutter_0428"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>
5、settings.gradle
pluginManagement {// 配置插件管理相关的设置repositories {// 定义插件管理的仓库来源google {// 使用 Google 的 Maven 仓库content {// 定义需要包含的组(group)正则表达式includeGroupByRegex("com\\.android.*") // 包含以 "com.android" 开头的组includeGroupByRegex("com\\.google.*") // 包含以 "com.google" 开头的组includeGroupByRegex("androidx.*") // 包含以 "androidx" 开头的组}}mavenCentral() // 使用 Maven Central 仓库gradlePluginPortal() // 使用 Gradle 插件门户}
}dependencyResolutionManagement {// 配置依赖解析相关的设置repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) // 设置仓库模式,如果项目中有仓库配置错误则失败repositories {google() // 使用 Google 的 Maven 仓库mavenCentral() // 使用 Maven Central 仓库}// 定义 Flutter 模块的存储 URLString storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"// 如果环境变量 FLUTTER_STORAGE_BASE_URL 未设置,则使用默认的 Flutter 存储 URL// 注意:该 URL 是 Flutter 依赖项的默认存储位置,但由于网络原因,可能无法直接访问// 如果您遇到问题,请检查链接的合法性或在网络正常的情况下重试repositories {maven {// 定义本地 Maven 仓库路径url 'D:/UsingForXAN/Projects/AndroidStudioProjects/FlutterProject/test_flutter_module_0418/build/host/outputs/repo'}maven {// 定义远程 Maven 仓库路径url "$storageUrl/download.flutter.io"}}
}// 设置项目的根项目名称
rootProject.name = "Test_Android_Embedding_Flutter_0428"
// 包含子项目 'app',这是 Android 项目的主模块
include ':app'
6、build.gradle
plugins {alias(libs.plugins.android.application)
}
// 定义项目使用的插件
// 这里使用了 alias 来引用预定义的插件,通常是定义在 buildSrc 或其他地方的插件别名
// 这里引用的是 Android 应用插件,用于构建 Android 应用android {namespace 'com.example.test_android_embedding_flutter_0428'// 设置项目的命名空间,用于区分不同的应用compileSdk 35// 设置编译 SDK 的版本,这里是 API 级别 35defaultConfig {applicationId "com.example.test_android_embedding_flutter_0428"// 设置应用的唯一标识符minSdk 28// 设置应用支持的最低 SDK 版本targetSdk 34// 设置应用的目标 SDK 版本versionCode 1// 设置应用的版本代码,用于内部版本管理versionName "1.0"// 设置应用的版本名称,显示给用户testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"// 设置用于运行 Android 测试的测试运行器}buildTypes {release {minifyEnabled false// 是否启用代码混淆,这里设置为 false 表示不启用proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'// 指定 ProGuard 配置文件,用于代码混淆规则}profile {initWith debug// 将 profile 构建类型初始化为 debug 构建类型的配置}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8// 设置源代码的 Java 版本兼容性targetCompatibility JavaVersion.VERSION_1_8// 设置目标字节码的 Java 版本兼容性}
}dependencies {// 定义项目的依赖项implementation libs.appcompat// 添加 AndroidX AppCompat 库的依赖,用于支持旧版本 Android 的兼容性implementation libs.material// 添加 Material Design 组件库的依赖,用于构建 Material Design 风格的界面implementation libs.activity// 添加 Activity 组件库的依赖,用于支持新的 Activity APIimplementation libs.constraintlayout// 添加 ConstraintLayout 布局库的依赖,用于构建复杂的布局testImplementation libs.junit// 添加 JUnit 测试框架的依赖,用于编写单元测试androidTestImplementation libs.ext.junit// 添加扩展的 JUnit 测试框架的依赖,用于 Android 测试androidTestImplementation libs.espresso.core// 添加 Espresso 测试框架的依赖,用于编写 UI 测试debugImplementation 'com.example.test_flutter_module_0418:flutter_debug:1.0'// 在 debug 构建类型中添加 Flutter 模块的 debug 版本依赖profileImplementation 'com.example.test_flutter_module_0418:flutter_profile:1.0'// 在 profile 构建类型中添加 Flutter 模块的 profile 版本依赖releaseImplementation 'com.example.test_flutter_module_0418:flutter_release:1.0'// 在 release 构建类型中添加 Flutter 模块的 release 版本依赖
}
相关文章:
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理 目录 Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理 一、简单介绍 二、在同一个布局中同时显示 Androi…...
在android 系统上qnn sdk转换,运行模型示例
前面讲了如何配置qnn sdk的环境,这一篇总结下qnn 实际转换一个onnx 模型,并运行的实现步骤。 设备: 1. ubuntu22.04 的Linux 服务器。 2. 一台android手机。 一、下载模型 from optimum.onnxruntime import ORTModelForSequenceClassifi…...
docker安装Canal1.1.5,MySQL5.7踩坑
docker安装Canal 前情提示安装MySQLdocker安装MySQL1. 拉取镜像2. 创建容器映射宿主机目录3. docker run 配置mysql重启mysql新建canal用户 安装Canal创建docker网络安装Canal1.拉取canal镜像2.创建目录3.运行容器 踩坑问题1 前情提示 关于版本问题,官方也没有详细…...
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
介绍 Spring Boot通过MessageSource接口来实现国际化,它可以加载不同的消息资源文件,通常是.properties格式。通过定义不同的语言文件(例如:messages_en.properties、messages_zh.properties等),可以根据用…...
C++ 嵌套类 (详解 一站式讲解)
目录 嵌套类 嵌套类的定义 嵌套类结构的访问权限 pimpl模式(了解) 嵌套类 嵌套类的定义 首先介绍两个概念: 类作用域(Class Scope) 类作用域是指在类定义内部的范围。在这个作用域内定义的成员(包括…...
EasyCVR视频汇聚平台助力大型生产监控项目摄像机选型与应用
一、方案背景 在300路大型生产监控项目中,由于生产环境复杂多样,涵盖室外厂区、大型车间、室内办公区域等不同场景,单一类型的摄像机难以满足全方位、精细化的监控需求。EasyCVR作为一款功能强大的视频融合管理平台,具备灵活的视…...
解决leensa无法使用的办法:平替教程
Leensa已经完全连不上,并显示超时,至于之前有传言称他们会恢复服务也完全是无稽之谈。 那么,Leensa停止服务后,广大的外贸人,设计人,留学生以及技术人学习,查资料以及开发客户该怎么办呢&#…...
算法思想之哈希表
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之哈希表 发布时间:2025.4.28 隶属专栏:算法 目录 算法介绍哈希表作用什么时候使用哈希表怎么使用哈希表 例题两数之和题目链接题目描述算法思路代码实现 判定是否互为字符重排题目链…...
springboot 视频分段加载在线播放
页面访问视频资源 前端播放加载部分视频,每次选中一个时间点后 往后加载一部分视频,主要用以节省网络传输的数据量 通过ResourceHttpRequestHandler类实现,ResourceHttpRequestHandler支持分片加载,前端请求头中携带Range: bytes 0-10001,就…...
【题解-Acwing】868. 筛质数
题目:868. 筛质数 题目描述 给定一个正整数 n,请你求出 1∼n 中质数的个数。 输入 共一行,包含整数 n。 输出 共一行,包含一个整数,表示 1∼n 中质数的个数。 数据范围 1 ≤ n ≤ 106 时空限制 0.2s / 64MB 输入样例 8输出样例 4代码 #include...
java 和 C#操作数据库对比
Java和C#在操作数据库方面有诸多相似之处,但也存在一些差异,以下从几个方面为你进行对比: 数据库连接 Java 在Java中,使用JDBC(Java Database Connectivity)来连接数据库。连接数据库的步骤通常包括加载…...
用 Python打造交互式图片-音视频管理器:代码分析与实践
在 Python 的 GUI 开发领域,wxPython 是一个功能强大且跨平台的框架,适合快速构建桌面应用程序。本文将深入分析一个基于 wxPython 的交互式图片管理器项目(SelectModelToPlayVideoAndAudio.py),该程序允许用户管理图片…...
Django 缓存框架
动态网站的一个基本权衡是它们是动态的。每当用户请求页面时,Web 服务器进行各种计算,从数据库查询到模板渲染到业务逻辑,以创建您网站访问者看到的页面。从处理开销的角度来看,这比标准的从文件系统中读取文件的服务器安排要昂贵…...
后缀数组~
子串:在字符串s中,取任意i<j,那么在s中截取从i到j的这一段就叫做s的一个子串。 后缀:后缀就是从字符串的某个位置i到字符串末尾的子串,我们定义以s的第i个字符为第一个元素的后缀为suff(i)。 suff(1)就是从第一个字符到最后一个…...
Rust 学习笔记:编程练习(一)
Rust 学习笔记:编程练习(一) Rust 学习笔记:编程练习(一)Convert temperatures between Fahrenheit and CelsiusGenerate the nth Fibonacci numberPrint the lyrics to the Christmas carol “The Twelve …...
【基础知识】常见的计算公式(一)
目录标题 定时器相关公式1. 定时器分频系数计算2. 定时器定时时间计算 波特率相关公式1. 异步串行通信波特率计算 PWM 相关公式1. PWM 占空比计算 不知道你们是不是和我一样,对定时器中的分频系数相关的计算公式,波特率计算公式等,都有点心生畏惧,其核心原因是不清楚不了解,没有…...
【AI生产力工具】Windsurf,一款AI编程工具
Windsurf 是 Codeium 公司推出的一款 AI 编程助手,它是一款集成深度上下文感知、多模型协作和实时代码管理的综合开发环境(IDE)。 Windsurf 作为 AI 编程工具的核心价值在于 “上下文感知 + 多模型协作 + 自动化工作流”,其深度集成的智能体系统(如 Flows 和 Cascade)正…...
【网络原理】TCP提升效率机制(三):延时应答和捎带应答
目录 一. 延时应答 二. 捎带应答 一. 延时应答 延时应答也是基于滑动窗口的一种提升传输效率的方式(减少ACK数量) 接收方收到数据之后,不会立刻返回一个ACK确认报文,而是等一会再返回ACK报文 这样做的好处? 1&…...
Golang|分布式索引架构
当文档数量巨大时,如一亿个文档,倒排索引难以全部放入单机内存。正排索引将热数据和冷数据分别存储在内存和磁盘中。分布式搜索引擎将数据分布在不同服务器上以应对大量数据。 倒排索引的水平切分 水平切分按关键词划分数据,如JAVA和算法在A服…...
【蓝桥杯省赛真题58】Scratch画台扇 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
目录 scratch画台扇 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C资料 scratch画台扇 第十五届青少年蓝桥杯scratch编程省赛真题解析 一…...
WebRTC SDK是什么?
语音环境每年都在变,OKCC以前代理商的客群都是简单高效外呼为主,今年发现变化很大。很多代理商做的终端客户都是给其他业务系统赋能为主了。主流的还是以API对接为主,但是对接中发现webrtc SDK使用频率很高。 那么什么是WebRTC SDK…...
反向代理、负载均衡与镜像流量:原理剖析、区别对比及 Nginx 配置实践
在现代网络架构中,反向代理、负载均衡和镜像流量是保障系统高效、稳定、安全运行的关键技术。虽然它们都涉及网络流量的管理与分发,但在功能、应用场景和实现方式上有着显著差异。本文将深入探讨三者的区别,并结合 Nginx 这一强大的开源服务器…...
PyCharm 2023升级2024 版本
windows下把老版本卸载之后,需要把环境变量,注册表信息删除。 并且把C:\Users\用户\AppData 文件夹下的 Local\JetBrains和Roaming\JetBrains 都删除,再重新安装 原旧项目升级的方式: 1.2023虚拟机的文件夹是venv 改为.venv…...
for(auto it: vec)和for(auto it: vec)的区别以及使用场景
目录 1.for(auto it: vec) 2.for(auto& it: vec) 3.总结 在 C 里,for(auto it: vec) 和 for(auto& it: vec) 都属于基于范围的 for 循环,可用于遍历容器(像 std::vector、std::list 等)或者数组。不过,它们…...
系统思考提升培训效能
彼得德鲁克曾说:管理者的价值,不在于处理了多少事务,而在于创造了多少不可替代的成果。效率是以正确的方法做事,效能则是做正确的事。在系统思考中我们看到:效率往往是对单点问题的反应,而效能则是对整体系…...
第1篇:Egg.js框架入门与项目初始化
一、Egg.js框架优势与设计理念 1. 为什么选择Egg.js? 作为基于Koa 2.x的渐进式企业级框架,Egg.js在阿里系大规模生产环境中验证成熟,具备以下核心优势: 约定优于配置 通过app/config目录结构自动加载机制,减少冗余配置…...
CMU-15445(1)——环境搭建
前言 最近在找完暑期实习之后,终于有了一些干项目外的空余时间学习新的知识,在这么多轮面试中,数据库的考察非常多,但孱弱的数据库基础导致我有很多次面试被问住,因此我希望在学习CMU-15445(Fall 2024&…...
Web基础与HTTP协议
目录 一:Web基础 1.域名和dns 1.1域名的概念 (1)域名的结构 (2)域名结构类型 2.Hosts文件 (1)hosts文件的作用 (2)修改hosts文件 3.DNS 4.域名注册 ࿰…...
数量关系7_行程问题
目录 一、基础行程1. 基础行程2. 比例法运用3. 相遇追及二、特殊情境1. 多次相遇问题(简单)2. 流水问题3. 火车过桥4. 等距离平均速度问题(简单)5. 匀加速一、基础行程 1. 基础行程 公式1:S = Vt 公式2:平均速度=(2 V1V2) / (V1+V2) 例题3(2023 广东) 某地举办了“铁…...
MTK Android12-13 App卸载加锁
实现:App 卸载时候需要加一层拦截锁,客户输入密码后才能正常卸载 文章目录 参考资料:实现方案涉及到修改文件修改方案实现效果 源码分析- 卸载方式一) 设置界面进行卸载InstalledAppDetailsAppInfoDashboardFragmentAppButtonsPre…...
文号验证-同时对两个输入框验证
文号验证-同时对两个输入框验证 效果: 一、如果有多个文号: <div v-for"(item, index) in approvalForm.productApprovalTypeEvents" :key"index"> <el-form-itemlabel"文号":prop"productApprovalTypeEv…...
嵌入式面试八股文(十二)·FreeRTOS中·堆和栈
目录 1. 堆和栈 1.1 堆 1.2 栈 1.3 堆和栈的区别 1.3.1 分配方式 1.3.2 分配效率 1.3.3 生长方向 1.3.4 空间管理 1.3.5 存放内容 1. 堆和栈 1.1 堆 堆是一块用于动态分配内存的区域,用于存储程序运行时动态创建的对象。堆的大小可以在程序运行…...
表的增删改查
目录 1、增删改查(CRUD) 2、新增(C) 3、查询(R) 3.1、全列查询 3.2、指定列查询 3.3、查询字段为表达式 3.4、别名 3.5、去重:distinct 3.6、查询时排序 1、增删改查(CRUD&…...
软考-软件设计师中级备考 4、数据结构
1、数据结构三要素 要素定义分类特点逻辑结构数据元素之间的逻辑关系,是从具体问题抽象出来的数学模型,与数据存储无关1. 集合结构:数据元素同属一个集合,无其他特殊关系 如一盒麦丽素豆子 2. 线性结构:元素存在一对…...
CMake:设置编译C++的版本
CMake提供了CMAKE_CXX_STANDARD用于设置C++的版本,比如可以通过如下方式设置使用C++23 set(CMAKE_CXX_STANDARD 23) 同时也提供了CMAKE_CXX_STANDARD_REQUIRED可以要求强制使用某个C++版本,比如: set(CMAKE_CXX_STANDARD_REQUIRED ON) 如果设置为 `ON`,那么 CMake 会要求编…...
【angular19】入门基础教程(一):项目的搭建与启动
angular现在发展的越来越能完善了,在vue和react的强势竞争下,它迎来了自己的巨大变革。项目工程化越来越好,也开始拥抱了vite这种高效的构建方式。所以,我们有必要来学习这么一个框架了。 项目实现效果 nodejs环境 Node.js - v^…...
在使用Python的Selenium库打卡网页后,通过CDP命令获取所有cookies(包括Httponly和Secure的cookies)
通过 Chrome DevTools Protocol (CDP) 结合 Selenium 可以直接获取浏览器存储的所有 Cookies(包括所有域名下的 Cookies),以下是详细步骤: 步骤 1:配置 Chrome 启用 CDP启动 Chrome 浏览器时需启用远程调试端口&#…...
Deepseek-v3+cline+vscode java自动化编程
1、Deepseek DeepSeek 充值后,创建apikey 2、vscode Visual Studio Code - Code Editing. Redefined 3、下载插件cline 4、配置deepeseek-v3 的密钥到cline 5、不可用 在开始的几次调用能正常使用起来,用了几次后,不能使用了,请求…...
5G育种技术之植物性状订制
行业展望 我国农作物种业市场规模逐年增长,其中以粮食作物种子市场规模较大。目前我国育种产业发展仍处于初级阶段,存在龙头企业市场占有率和行业集中度不高、企业育种技术和水平落后于发达国家、种企研发投入不足等问题。虽然基因编辑技术的出现有望改…...
12前端项目----添加购物车1.0
商品添加购物车 商品数量添加购物车浏览器本地存储localStoragesessionStorage添加成功页面 商品数量 输入为数字,最少为1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…...
Elastic Platform 8.18 和 9.0:ES|QL Lookup Joins 功能现已推出,Lucene 10!
作者:来自 Elastic Elastic Platform Team Elastic 最新发布的 8.18 和 9.0 版本包含了强大的更新,将显著提升你的体验、增强查询性能并优化日志管理。无论你是在处理搜索、可观察性还是安全用例,本次发布都带来了大量新特性,旨在…...
两地三中心
1. 什么是同城备份 ✅ 定义: 主机房和备份机房都在同一座城市,通常距离几十公里以内(比如10-50公里)。 ✅ 特点: 网络延迟很低(毫秒级),可以做到实时同步/热备份。 恢复速度快&am…...
数据结构第七章(一)-顺序查找和折半查找
数据结构第七章(一) 顺序查找和折半查找一、查找1.平均查找长度(ASL) 二、顺序查找1.实现2.算法优化 三、折半查找1.实现2.查找判定树 四、分块查找1.算法思想2.查找效率分析(ASL) 总结 顺序查找和折半查找…...
springboot项目之websocket的坑:spring整合websocket后进行单元测试后报错的解决方案
前排提醒:还是博主菜,见识短浅,没遇到过这个问题。。。 起因 前段时间学习websocket和sse,写demo用了spring框架。后来又写了新的spring单元测试类demo去测试,结果启动后报错,报错信息提示websocket的相关…...
在单片机编程中充分使用抽象工厂模式,确保对象创建的限制,多使用抽象接口避免多变具体实现类
背景 在软件架构设计上追求稳定,就必须多使用稳定的抽象接口,少依赖多变的实现;具体编码时可以充分使用抽象工厂模式 举例进行详细讲解和说明抽象工厂模式在单片机开发中的应用 抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组相关的对象创建封装到一个…...
喷泉码技术在现代物联网中的应用的总结和参考文献
总结 物联网与 5G 技术高速发展,数据传输对可靠性和实时性提出严苛要求。前向纠错码是增强通信鲁棒性的关键,但平衡冗余资源开销与编解码效率的矛盾是核心难题。LT 码和 Raptor 码是无率码典型。理论上它们能达渐进最优性能,然而实际系统受数据包规模、计算资源等限制,其工…...
vuex与vuex-persistedstate 插件固化数据
一,vuex与vuex-persistedstate 插件固化数据 的小案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Vuex基础案例</title></head><body><div id"app"&…...
如何在WordPress网站中设置双重验证,提升安全性
随着互联网的不断进步,网站的安全问题越来越受到重视。尤其对于WordPress这样常用的建站平台,安全性显得尤为重要。尽管WordPress自带一定的安全性,但仅依靠用户名和密码的登录方式仍然存在风险。因此,启用“双重验证”便成为了提…...
2025系统架构师---基于规则的系统架构风格
引言 在业务规则频繁变更、决策逻辑高度动态化的现代企业环境中,基于规则的系统架构风格(Rule-Based System Architecture Style)通过将核心业务逻辑抽象为可配置规则、规则引擎与决策服务的分离,实现了业务敏捷…...
Python排序中lambda函数详解
在 Python 中,lambda 函数是一种匿名函数,通常用于需要一个函数但又不想为其定义一个正式名称的情况。在排序操作中,lambda 函数用于指定排序的依据。 lambda 函数的基本语法 lambda 函数的基本语法如下: lambda arguments: ex…...