Android在kts中使用navigation及Args

Android在kts中使用navigation及Args

前言:

​ 之前在项目中使用过navigation,但都是以Groory的方式,最近一年多使用kts后忍不住把项目都改成kts的方式,不过其中也遇到不少坑,今天就讲解一下如何在kts中使用navigation和安全地传递参数Args。

1.项目依赖导入:

在libs.versions.toml文件下添加以下依赖:

navigationFragmentKtx = "2.6.0"
navigationUiKtx = "2.6.0"navigation-fragment = {group = "androidx.navigation",name = "navigation-fragment-ktx",version.ref = "navigationFragmentKtx"}
navigation-ui = {group = "androidx.navigation",name = "navigation-ui-ktx",version.ref = "navigationUiKtx"}navigation-safe-args = { id = "androidx.navigation.safeargs.kotlin", version = "2.8.0" }

在这里插入图片描述

2.app目录的build.gradle配置:

plugins {alias(libs.plugins.androidApplication)alias(libs.plugins.jetbrainsKotlinAndroid)alias(libs.plugins.navigation.safe.args)
}implementation(libs.navigation.fragment)implementation(libs.navigation.ui)

在这里插入图片描述

在这里插入图片描述

3.项目的build.gradle配置:

plugins {alias(libs.plugins.androidApplication) apply falsealias(libs.plugins.jetbrainsKotlinAndroid) apply falsealias(libs.plugins.navigation.safe.args) apply false
}

在这里插入图片描述

4.在布局添加导航组件:

在res目录添加navigation——nav_graph文件

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/nav_graph"app:startDestination="@id/mainFragment"><fragmentandroid:id="@+id/mainFragment"android:label="fragment_main"android:name="com.cloud.flowbusdemo.fragment.MainFragment"tools:layout="@layout/fragment_main"><actionandroid:id="@+id/action_mainFragment_to_secondFragment"app:destination="@id/secondFragment"app:popEnterAnim="@anim/slide_in_left"app:popExitAnim="@anim/slide_out_right"app:enterAnim="@anim/slide_in_right"app:exitAnim="@anim/slide_out_left"/><actionandroid:id="@+id/action_mainFragment_to_mineFragment"app:destination="@id/mineFragment"app:enterAnim="@anim/slide_in_left"app:exitAnim="@anim/slide_in_right"app:popEnterAnim="@anim/slide_out_left"app:popExitAnim="@anim/slide_out_right" /><argumentandroid:name="name"app:argType="string"android:defaultValue="xiaozhang"/><argumentandroid:name="age"app:argType="integer"android:defaultValue="1"/></fragment><fragmentandroid:id="@+id/secondFragment"android:label="fragment_second"android:name="com.cloud.flowbusdemo.fragment.SecondFragment"tools:layout="@layout/fragment_second"/><fragmentandroid:id="@+id/mineFragment"android:name="com.cloud.flowbusdemo.fragment.MineFragment"android:label="fragment_mine"tools:layout="@layout/fragment_mine" />
</navigation>

在这里插入图片描述

5.Fragment_main布局:

fragment_mine.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/tvTitle"android:layout_width="0dp"android:layout_height="40dp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toTopOf="parent"android:textSize="18sp"android:textColor="@color/white"android:gravity="center"android:text="MainFragment"android:layout_margin="20dp"android:background="@color/design_default_color_primary"tools:ignore="MissingConstraints" /><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/btnToSecondFragment"android:layout_width="0dp"android:layout_height="40dp"app:layout_constraintTop_toBottomOf="@id/tvTitle"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"android:textAllCaps="false"android:textColor="@color/white"android:gravity="center"android:layout_margin="20dp"android:background="@color/design_default_color_primary"android:text="打开SecondFragment"/><androidx.appcompat.widget.AppCompatTextViewandroid:id="@+id/btnToMineFragment"android:layout_width="0dp"android:layout_height="40dp"app:layout_constraintTop_toBottomOf="@+id/btnToSecondFragment"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"android:textAllCaps="false"android:layout_marginTop="10dp"android:textColor="@color/white"android:gravity="center"android:layout_margin="20dp"android:background="@color/design_default_color_primary"android:text="打开MineFragment"/>
</androidx.constraintlayout.widget.ConstraintLayout>

6.Fragment_mine布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"><TextViewandroid:id="@+id/tvTitle"android:layout_width="200dp"android:layout_height="50dp"android:textSize="20sp"tools:text="姓名"android:gravity="center"android:background="@color/design_default_color_primary"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"android:textColor="@color/white"android:layout_marginTop="20dp"/><TextViewandroid:id="@+id/tvAge"android:layout_width="200dp"android:layout_height="50dp"android:textSize="18sp"tools:text="年龄"android:gravity="center"android:background="@color/design_default_color_primary"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toBottomOf="@id/tvTitle"android:textColor="@color/white"android:layout_marginTop="20dp"/></androidx.constraintlayout.widget.ConstraintLayout>

7.Fragment_second布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"><TextViewandroid:id="@+id/tvTitle"android:layout_width="200dp"android:layout_height="50dp"android:textSize="20sp"tools:text="姓名"android:gravity="center"android:background="@color/design_default_color_primary"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"android:textColor="@color/white"android:layout_marginTop="20dp"/><TextViewandroid:id="@+id/tvAge"android:layout_width="200dp"android:layout_height="50dp"android:textSize="18sp"tools:text="年龄"android:gravity="center"android:background="@color/design_default_color_primary"app:layout_constraintStart_toStartOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toBottomOf="@id/tvTitle"android:textColor="@color/white"android:layout_marginTop="20dp"/></androidx.constraintlayout.widget.ConstraintLayout>

8.activity_main主界面:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv_wallpaper"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingStart="2dp"android:paddingEnd="2dp"android:visibility="gone" /><ProgressBarandroid:id="@+id/pb_loading"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/btn_get_wallpaper"android:layout_width="0dp"android:layout_height="40dp"android:text="获取壁纸"android:textColor="@color/white"android:gravity="center"android:background="@color/design_default_color_primary"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:layout_margin="20dp"/><fragmentandroid:id="@+id/nav_host_fragment"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="0dp"android:layout_height="0dp"app:defaultNavHost="true"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/btn_get_wallpaper"app:navGraph="@navigation/nav_graph"android:layout_marginTop="20dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

9.MainActivity代码:

package com.cloud.flowbusdemoimport android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import com.blankj.utilcode.util.LogUtils
import com.cloud.flowbusdemo.databinding.ActivityMainBinding
import com.cloud.flowbusdemo.flow.FlowBus
import com.cloud.flowbusdemo.http.HttpUtils
import com.cloud.flowbusdemo.intent.MainIntent
import com.cloud.flowbusdemo.model.MessageEvent
import com.cloud.flowbusdemo.service.FlowBusTestService
import com.cloud.flowbusdemo.ui.adapter.WallpaperAdapter
import com.cloud.flowbusdemo.ui.viewmodel.MainViewModel
import com.cloud.flowbusdemo.ui.viewmodel.ViewModelFactory
import com.cloud.flowbusdemo.uistate.MainUIState
import com.cloud.flowbusdemo.utils.CToast
import com.cloud.flowbusdemo.utils.GenericToast
import com.cloud.flowbusdemo.utils.SingleToast
import kotlinx.coroutines.launchclass MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingprivate lateinit var mainViewModel: MainViewModelprivate var wallPaperAdapter = WallpaperAdapter(arrayListOf())private val TAG = "flowBusDemo"private var mCToast: CToast? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root)mainViewModel = ViewModelProvider(this,ViewModelFactory(HttpUtils.apiService))[MainViewModel::class.java]initView()observeViewModel()initService()}private fun initService() {val intent = Intent(this@MainActivity, FlowBusTestService::class.java)intent.putExtra("sockUrl","")startService(intent)}/*** ViewModel*/@SuppressLint("NotifyDataSetChanged")private fun observeViewModel() {lifecycleScope.launch {mainViewModel.state.collect {when (it) {is MainUIState.Idle -> {}is MainUIState.Loading -> {binding.btnGetWallpaper.visibility = View.GONEbinding.pbLoading.visibility = View.VISIBLE}is MainUIState.Success -> {     //数据返回binding.btnGetWallpaper.visibility = View.GONEbinding.pbLoading.visibility = View.GONEbinding.rvWallpaper.visibility = View.VISIBLEit.wallpaper.let { paper ->wallPaperAdapter.addData(paper.res.vertical)}wallPaperAdapter.notifyDataSetChanged()}is MainUIState.Error -> {binding.pbLoading.visibility = View.GONEbinding.btnGetWallpaper.visibility = View.VISIBLELog.d("TAG", "observeViewModel: $it.error")Toast.makeText(this@MainActivity, it.error, Toast.LENGTH_LONG).show()}}}}}/*** 初始化*/private fun initView() {binding.rvWallpaper.apply {layoutManager = GridLayoutManager(this@MainActivity, 2)adapter = wallPaperAdapter}binding.btnGetWallpaper.setOnClickListener {lifecycleScope.launch {mainViewModel.mainIntentChannel.send(MainIntent.GetWallpaper)}val intent = Intent(this@MainActivity,TestActivity::class.java)startActivity(intent)val timeToast =SingleToast.makeText(this@MainActivity, "显示时间自定的Toast", 10.0)timeToast.show()}FlowBus.with<MessageEvent>("test").register(this@MainActivity) {LogUtils.d(TAG,it.toString())if(it.message == "stop"){LogUtils.d(TAG,"===接收到的消息为==="+it.message)}}FlowBus.with<MessageEvent>("mineFragment").register(this@MainActivity) {LogUtils.d(TAG,it.toString())if(it.message == "onMine"){LogUtils.d(TAG,"===接收到的消息为1111==="+it.message)}}}
}

在这里插入图片描述

10.MainFragment代码:

package com.cloud.flowbusdemo.fragmentimport android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.Navigation
import com.cloud.flowbusdemo.R
import com.cloud.flowbusdemo.databinding.FragmentMainBindingprivate const val ARG_PARAM_NAME = "name"
private const val ARG_PARAM_AGE = "age"/*** @auth: njb* @date: 2024/9/17 18:46* @desc: 描述*/
class MainFragment : Fragment() {private lateinit var binding: FragmentMainBindingprivate var name: String? = nullprivate var age: Int? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)arguments?.let {name = it.getString(ARG_PARAM_NAME)age = it.getInt(ARG_PARAM_AGE)}}override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View {binding = FragmentMainBinding.inflate(layoutInflater)initView()return binding.root}private fun initView() {binding.btnToSecondFragment.setOnClickListener(View.OnClickListener { v ->/*      val bundle = Bundle()bundle.putString("name", "Michael")bundle.putInt("age", 30)*/val args: Bundle = Bundle().apply {this.putString(ARG_PARAM_NAME, "哈哈")this.putInt(ARG_PARAM_AGE, 25)}Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_secondFragment, args)})binding.btnToMineFragment.setOnClickListener{v ->val args: Bundle = Bundle().apply {this.putString(ARG_PARAM_NAME, "Tom")this.putInt(ARG_PARAM_AGE, 18)}val navController = Navigation.findNavController(v)//navController.navigate(R.id.action_mainFragment_to_mineFragment, args)val bundle: Bundle = MainFragmentArgs("haha",20).toBundle()Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_mineFragment,bundle)}}}

11.MineFragment代码:

package com.cloud.flowbusdemo.fragmentimport android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.navArgs
import com.cloud.flowbusdemo.databinding.FragmentMineBinding
import com.cloud.flowbusdemo.flow.FlowBus
import com.cloud.flowbusdemo.model.MessageEvent
import kotlinx.coroutines.launchprivate const val ARG_PARAM_NAME = "name"
private const val ARG_PARAM_AGE = "age"
/*** @auth: njb* @date: 2024/9/17 19:43* @desc: 描述*/
class MineFragment :Fragment(){private lateinit var binding: FragmentMineBindingprivate val TAG = "MineFragment"private var name: String? = nullprivate var age: Int? = 0private val args:MainFragmentArgs by  navArgs()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)args.let {name = args.nameage = args.age}Log.i(TAG, "传递过来的参数为 name = $name , age = $age")Log.d(TAG, "姓名:" + name + "年龄:" + age)}override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View {binding = FragmentMineBinding.inflate(layoutInflater)initView()return binding.root}private fun initView() {val messageEvent = MessageEvent()messageEvent.message = "onMine"messageEvent.state = falsebinding.let {it.tvTitle.text = nameit.tvAge.text  = age.toString()it.tvTitle.setOnClickListener {lifecycleScope.launch {FlowBus.with<MessageEvent>("mineFragment").post(this, messageEvent)}}}}
}

12.SecondFragment代码:

package com.cloud.flowbusdemo.fragmentimport android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import com.cloud.flowbusdemo.constants.Constants
import com.cloud.flowbusdemo.databinding.FragmentMineBinding
import com.cloud.flowbusdemo.databinding.FragmentSecondBinding
import com.cloud.flowbusdemo.flow.FlowBus
import com.cloud.flowbusdemo.model.MessageEvent
import kotlinx.coroutines.launch/*** @auth: njb* @date: 2024/9/17 18:48* @desc: 描述*/
class SecondFragment : Fragment(){private val TAG = "SecondFragment"private var name: String? = nullprivate var age: Int? = nullprivate lateinit var binding: FragmentSecondBindingoverride fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View {binding = FragmentSecondBinding.inflate(layoutInflater)initView()return binding.root}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)arguments?.let {name = it.getString(Constants.ARG_PARAM_NAME)age = it.getInt(Constants.ARG_PARAM_AGE)}Log.i(TAG, "MainFragment 传递到 SecondFragment 的参数为 name = $name , age = $age")Log.d(TAG, "姓名:" + name + "年龄:" + age)}private fun initView() {binding.let {it.tvTitle.text = nameit.tvAge.text  = age.toString()}}
}

13.传递参数的方式:

13.1使用bundle:

binding.btnToSecondFragment.setOnClickListener(View.OnClickListener { v ->val bundle = Bundle()bundle.putString("name", "Michael")bundle.putInt("age", 30)Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_secondFragment, bundle)
})

在这里插入图片描述

13.2使用Safs安全方式传递:

binding.btnToMineFragment.setOnClickListener{v ->val bundle: Bundle = MainFragmentArgs("haha",20).toBundle()Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_mineFragment,bundle)
}

在这里插入图片描述

14.实现效果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

15.项目demo地址:

https://gitee.com/jackning_admin/flowbus-demo

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

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

相关文章

MyBatis缓存详解(一级缓存、二级缓存、缓存查询顺序)

固态硬盘缺陷&#xff1a;无法长时间使用&#xff0c;而磁盘只要不消磁&#xff0c;只要不受到磁影响&#xff0c;就可以长期使用&#xff0c;因此绝大多数企业还是使用磁盘来存储数据 像mysql这种关系型数据库中的数据存储在磁盘中&#xff0c;为方便查询&#xff0c;减少系统…

springboot襄阳华侨城奇幻度假区服务平台-计算机毕业设计源码93560

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3 开发技术 1.3.1 B/S架构 1.3.2 Spring Boot框架 1.3.3 Java语言 1.3.4 MySQL数据库 1.4论文章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 登录流程 2.2.2数据删除流程 2.3 系统…

2024年好用不踩雷的8款图纸加密软件推荐!CAD图纸加密软件!

在2024年&#xff0c;随着信息安全需求的提升&#xff0c;特别是对于设计、建筑、制造等行业的CAD图纸保护&#xff0c;图纸加密软件的选择尤为重要。以下推荐了8款优质的CAD图纸加密软件&#xff0c;这些软件不仅提供了强大的加密功能&#xff0c;还在易用性和兼容性方面表现出…

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来&#xff0c;FICC 投资交易呈现活跃多元态势&#xff0c;创新转型稳步推进。FICC 平台电子化方兴未艾&#xff0c;是机构提升服务效率和质量的一大着力点。因此&#xff0c;在 FICC 平台建设上&#xff0c;许多机构都进行了深入研究&#xff0c;积累了丰富的实践经验。 …

MongoDB快速入门

MongoDB 概念 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在MongoDB中数据主要的组织…

Spring boot 配置文件的加载顺序

Spring Boot 在启动时会扫描以下位置的 application.properties 或者 application.yml 文件作为全局配置文件&#xff1a; –file:./config/–file:./–classpath:/config/–classpath:/以下是按照优先级从高到低的顺序&#xff0c;如下所示&#xff1a; Spring Boot 会全部扫…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

自由学习记录(15)

Java注解 else if的省略问题&#xff08;可能看花&#xff09; else if也是取最近的if连通&#xff0c;看上去加了{}就可以正常执行了&#xff0c;缩进要命&#xff0c;不提示真容易看错&#xff0c; 组合数公式和数组参数 在 C 中&#xff0c;数组作为函数参数时&#xff0c;…

【课件分享】蓝光光盘及光驱团标解读

关注我们 - 数字罗塞塔计划 - 10月26日&#xff0c;非常感谢陶光毅老师携特邀嘉宾许斌老师和游泳总能够在百忙之中抽空莅临数字罗塞塔计划直播间&#xff0c;为大家带来蓝光光盘及光驱团标解读。作为标准的起草者&#xff0c;你们的专业见解和宝贵经验&#xff0c;让我们对T/CE…

Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节&#xff5c;征文# 支持向量机&#xff08;SVM&#xff09;的详细讲解 什么是SVM&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…

Windows/Linux(服务器)查看显卡的名称

文章目录 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09;2. 使用 wmic 命令&#xff08;Windows&#xff09; 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09; 如果服务器上安装了 NVIDIA 驱动程序&#xff0c;可以使用 nvidia-smi 工具来查看…

vue使用xlsx以及file-saver进行下载xlsx文件以及Unit8Array、ArrayBuffer、charCodeAt的使用

先说Unit8Array、ArrayBuffer、charCodeAt的使用下面会用到这三个 Unit8Array&#xff1a;数组类型表示一个 8 位无符号整型数组&#xff0c;创建时内容被初始化为 0。创建完后&#xff0c;可以以对象的方式或使用数组下标索引的方式引用数组中的元素。 new Uint8Array(); //…

Docker中如何控制服务启动顺序实现探讨

文章目录 一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm 三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序 四、思路分析1.各走各路1.&#xff09;docker-compose -f指定不同配置文件2.&#xff09;docker-compose up -d service-name指定服务名3…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…

巡飞单机多旋翼无人机技术详解

巡飞单机多旋翼无人机技术是一种集成了多种先进技术的无人机系统&#xff0c;它具备自主飞行、长续航、高精度控制以及多任务负载能力等特点。以下是对巡飞单机多旋翼无人机技术的详细解析&#xff1a; 一、机架与结构设计 1.材料选择&#xff1a;为了确保无人机能够承载足够…

cmake命令使用

有关cmake的入门简介可参见 CMake入门教程_cmake静态test.c编译-CSDN博客 本文是进一步对cmake常用命令做进一步详述 配置项目 cmake_minimum_required 作用 配置cmake最低版本 用法 cmake_minimum_required(VERSION 3.0) project 作用&#xff1a;设置预设变量 PROJEC…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础&#xff1a;神经网络、训练过程与激活函数 引言&#xff1a; 深度学习作为机器学习的一个子领域&#xff0c;近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构&#xff0c;使得计算机能够从数据中学习复杂的模式和特征&#xff0c;…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

linux面试题复习

前言 现在只是初版&#xff0c;很多格式我还没有改好&#xff0c;会慢慢修改订正。 可能用到的网址&#xff1a;在线 EXCEL 到 MARKDOWN 转换器。 参考了很多网上的面试题和外网上的面试题&#xff1a; 参考文档&#xff1a; 程序员的50大Linux面试问题及答案 Top 60 Linux …

MySQL——test4(综合练习)

目录 建库建表&#xff08;题目&#xff09;处理表1. 修改student 表中年龄(sage)字段属性&#xff0c;数据类型由int 改变为smallint2. 为Course表中Cno 课程号字段设置索引,并查看索引3. 为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引&#xff0c;索引名为SC_INDE…