Skip to content

Commit

Permalink
update kotlin part
Browse files Browse the repository at this point in the history
  • Loading branch information
CharonChui committed Apr 11, 2024
1 parent 26bdff7 commit 33e2505
Show file tree
Hide file tree
Showing 8 changed files with 241 additions and 9 deletions.
28 changes: 24 additions & 4 deletions Jetpack/architecture/12.Navigation简介.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@

为此,Jetpack提供了一个名为Navigation的组件,旨在方便我们管理页面和App bar。


Navigation 是一个框架,用于在 Android 应用中的“目的地”之间导航,该框架提供一致的 API,无论目的地是作为 fragment、activity 还是其他组件实现。



它具有以下优势:

- 可视化的页面导航图,类似于Apple Xcode中的StoryBoard,便于我们理清页面间的关系。
Expand All @@ -15,6 +20,16 @@

Navigation 组件旨在用于具有一个主 Activity 和多个 Fragment 目的地的应用。主 Activity 与导航图相关联,且包含一个负责根据需要交换目的地的 `NavHostFragment`。在具有多个 Activity 目的地的应用中,每个 Activity 均拥有其自己的导航图。


在使用过程中,我们感受到如下的优点。

- 页面跳转性能更好,在单 Activity 的架构下,都是 fragment 的切换,每次 fragment 被压栈之后,View 被销毁,相比之前 Activity 跳转,更加轻量,需要的内存更少。
- 通过 Viewmodel 进行数据共享更便捷,不需要页面之间来回传数据。
- 统一的 Navigation API 来更精细的控制跳转逻辑。




## 依赖

如果想要使用Navigation,需要现在build.gradle文件中添加以下依赖:
Expand Down Expand Up @@ -51,17 +66,20 @@ dependencies {

导航组件由以下三个关键部分组成:

1. Navigation Graph
1. Navigation Graph : 图表

一种数据结果,用于定义应用中的所有导航目的地以及它们如何连接在一起。
在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为*目标*)以及用户可以通过应用获取的可能路径。

2. NavHost

2. NavHost : 主机

显示导航图中目标的空白容器。导航组件包含一个默认NavHost实现 (NavHostFragment),可显示Fragment目标。

3. NavController
3. NavController : 控制器

在NavHost中管理应用导航的对象。当用户在整个应用中移动时,NavController会安排NavHost中目标内容的交换。
在NavHost中管理应用导航的对象。当用户在整个应用中移动时,NavController会安排NavHost中目标内容的交换。
该控制器提供了一些方法,可用于在目的地之间导航、处理深层链接、管理返回堆栈等。

在应用中导航时,您告诉NavController,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController便会在NavHost中显示相应目标。

Expand Down Expand Up @@ -476,7 +494,9 @@ override fun onCreate(savedInstanceState: Bundle?) {

```

### 参考

https://mp.weixin.qq.com/s?src=11&timestamp=1712714064&ver=5191&signature=JTMgHGLtMGW*NoSWSrLNVuGzs-KEEDznO-ja7*X*KumZMFAuIRl7WbPYT1gG7AX810nUx6Ftb6nm6Ao92M*GzojPfqBUo1wOFc0gMs1mseTLkUWZ9Q*BIW69MM7ULPDV&new=1


- [上一篇:11.Hilt简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md)
Expand Down
5 changes: 5 additions & 0 deletions Jetpack/architecture/4.ViewModel简介.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@

`ViewModel`是专门用于存放应用程序页面所需的数据。ViewModel将页面所需的数据从页面中剥离出来,页面只需要处理用户交互和展示数据。


ViewModel类是一种业务逻辑或屏幕级状态容器。
它用于将状态公开给界面,以及封装相关的业务逻辑。
它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在activity之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。

Viewmodel解决两个问题:

1. 数据的变更与view隔离,也就是解耦
Expand Down
Binary file removed KotlinCourse/.8.Kotlin_协程.md.swp
Binary file not shown.
139 changes: 139 additions & 0 deletions KotlinCourse/1.Kotlin_简介&变量&类&接口.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,10 +324,42 @@ var myProperty: String
}
```

自定义set和get的重点在field,field指代当前参数,类似于java的this关键字。

这意味着无论何时当你使用点操作符来获取或设置属性值时,实际上你总是调用了属性的getter或是setter。那么,为什么编译器要这么做呢?
为属性添加getter和setter意味着有访问该属性的标准方法。getter处理获取值的所有请求,而setter处理所有属性值设置的请求。
因此,如果你想要改变处理这些请求的方式,你可以在不破坏任何人代码的前提下进行。通过将其包装在getter和setter中来输出对属性的直接访问称为数据隐藏。


在某些情况下,无参的函数与只读属性可互换通用。虽然语义相似,但在以下情况中,更多的是选择使用属性而不是方法。

- 不会抛出任何异常。
- 具有O(1)的复杂度。
- 容易计算(或者运行一次之后缓存结果)。
- 每次调用返回同样的结果。



## 后端属性(Blocking Property)

它实际上是一个隐含的对属性值的初始化声明。能有效避免空指针问题的产生。

```kotlin
var size: Int = 2;
private var _table: Map<toString, Int>? = null

val table: Map<String, Int>
get() {
if (_table == null) {
_table = HashMap()
}
return _table ?: throw AssertionError("Set to null by another thread")
}
```

Java中,访问private成员变量需要通过getter和setter来实现,此处通过table来获取_table变量,优化了Java中函数调用带来的开销。


## 延迟初始化

在类内声明的属性必须初始化,如果设置非`null`的属性,应该将此属性在构造器内进行初始化。
Expand Down Expand Up @@ -475,6 +507,47 @@ fun getName() : String {
```
## @操作符
在Kotlin中,@操作符主要有两个作用:
- 限定this的对象类型
```kotlin
class User {
inner class State {
fun getUser(): User {
return this@User // 返回User
}
fun getState(): State {
return this@State // 返回State
}
}
}
```
- 作为标签使用
当把@操作符作为标签使用时,可以跳出双层for循环和forEach函数。
例如:
```kotlin
val listA = listOf(1, 2, 3, 4, 5, 6)
val listB = listOf(2, 3, 4, 5, 6, 7 )
loop@ for(itemA in listA) {
var i: Int = 0
for (itemB in listB) {
i++
if (item > 2) {
break @loop // 当itemB > 2时,跳出循环
}
println("itemB: $itemB")
}
}
```
## 类的定义:使用`class`关键字
Expand Down Expand Up @@ -630,6 +703,25 @@ class Person private constructor(name: String) {
}
```
```kotlin
open class Base(p: Int)
class Example(p: Int) : Base(p)
```
如果该类有一个主构造函数,那么其基类型可以用主构造函数的参数进行初始化。
如果该类没有主构造函数,那么每个次构造函数必须使用super关键字初始化其类型,或者委托给另一个构造函数初始化。如:
```kotlin
class Example : View {
constructor(ctx: Context) : super(ctx)
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
}
```
#### 构造方法默认参数
```kotlin
Expand Down Expand Up @@ -841,6 +933,48 @@ var age = f1.component2()
对于有些不需要toString()、equals()、hashCode()方法的类如果使用数据类就会导致多生成这些代码,所以在使用数据类的时候不要去为了简单而乱用,
也要去想想是否需要这些方法?是否需要设计成数据类。


#### 获取类中成员函数的对象

```kotlin
fun main(args: Array<String>) {
var user = User::special
// 调用invoke函数执行
user.invoke(User("Jack", 30))

// 利用反射机制获取指定方法的内容
var method = User::class.java.getMethod("special")
method.invoke(User("Tom", 20))
}

class User(val name: String, val age: Int) {
fun special() {
println("name:${name") age:${age}");
}
}
```
在上面的实例中,User类还有一个special函数,使用User::special可以获取成员函数的对象,然后使用invoke函数调用special函数,以获取该函数的内容。
### 构造函数引用
构造函数的引用和属性、方法类似,构造函数可以作用于任何函数类型的对象,该函数的对象与构造函数的参数相同,可以使用::操作符加类名的方式来引用构造函数。
```kotlin
class Foo
fun function(factory: () -> Foo) {
val x: Foo = factory()
}
// 使用::Foo方式调用类Foo的无参数构造函数
fun main() {
function(::Foo)
}
```
## 继承
在`Kotlin`中所有类都有一个共同的超类`Any`,这对于没有超类型声明的类是默认超类:
Expand Down Expand Up @@ -1214,6 +1348,11 @@ val mList2 = vars(0, *myArray, 6, 7)
```
在Kotlin中,方法调用也被定义为二元操作运算符,而这些方法往往可以转化为invoke函数。
例如 a(i)方法的对应转换方法为 a.invoke(i)
## 命名风格
如果拿不准的时候,默认使用`Java`的编码规范,比如:
Expand Down
Loading

0 comments on commit 33e2505

Please sign in to comment.