我不赞成「如何在 A 实现 B」之类的尝试。 每个东西都有它自己的特点,这个特点用好了就是优点,用不好就是缺点。非要用汽车拉磨或用驴子拉货,何必呢。继承 vs 组合一句话解释,继承是「is sth」,组合是「has sth」。Go 采用组合完美契合了它鸭子类型(duck typing)的设计理念。“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。鸭子类型...
我不赞成「如何在 A 实现 B」之类的尝试。 每个东西都有它自己的特点,这个特点用好了就是优点,用不好就是缺点。非要用汽车拉磨或用驴子拉货,何必呢。继承 vs 组合一句话解释,继承是「is sth」,组合是「has sth」。Go 采用组合完美契合了它鸭子类型(duck typing)的设计理念。“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。鸭子类型...
传送门给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。分析这是一道 Medium 难度的题目,主要是被删除的节点要分多种情况处理。一共有三类四种情况。被删除的节点是叶子。被删除的节点只有一个孩子...
传送门给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例 1:输入:n = 12 输出:3 解释:12 = 4 + 4 + 4坑 - 贪心算法既然所求的是最少数量,很容易想到贪心算法:每次都找一个能取到的最大完全平方数...
传送门给定一组 X-Y 平面上的点,返回位于同一条直线上的最大点数。例子:Input: points = [[1,1],[2,2],[3,3]] Output: 3约束:1 <= points.length <= 300points[i].length == 2-104 <= xi, yi <= 104没有重复的点分析这是一个 hard 级别的题目,但私以为主要是细...
嵌入显示Viwe 中嵌入 Compose乍一看这活挺复杂的,其实很简单。首先在传统 View 里加一个 ComposeView 作为 Compose 的容器:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.a...
⚠️ 警告:这一节非常硬核,我花了三天学习,所以不建议尝试短时间看完并理解。本节源码参照 Compose 1.3.0-alpha02回顾虽然还没有系统地学习过,对 Modifier 我们也不陌生,它用来给组件设置各种属性与监听。对于 Modifier 和直接传参也做过简要的总结:前者多用于通用属性,后者多用于特有属性。多个 Modifer 有先后关系,典型例子是 Modifier.paddi...
从某种角度来说,Compose 组件是无状态的。这很好理解 —— Compose 的那些组件函数甚至都不会返回一个对象,哪有状态可言?对于传统 View,比如 TextView,可以通过 TextView.getText() 来获取其内部状态,当然,还有很多其他属性。那么 Compose 中又如何实现?答案就是 状态提升 (State Hoisting)。听起来很高大上,实际上很粗暴。所谓「...
对于 Compose 中的数据,用 mutableStateOf() 包裹来实现监听刷新我们已经轻车熟路。那如果一个数据依赖于另一个或多个数据怎么办?这就用到 derivedStateOf(),它专门用于数据的转换,当上游数据发生变化时会自动刷新下游数据,进一步刷新 UI。有点类似 LiveData 中 Transformations.switchMap 的作用。Show me the co...