0%

Dart里坑人的extension

先随便去哪里run下面的代码(图简便直接跑DartPad

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void main() {
final x = _111();
print('methods inside class');
for (int i = 0; i < 5; i++) {
print(x.helloworld.hashCode);
}
print('methods inside extension of class');
for (int i = 0; i < 5; i++) {
print(x.helloworldOnExtension.hashCode);
}
}

class _111 {
void helloworld() {}
}

extension on _111 {
void helloworldOnExtension() {}
}

看输出你发现了什么?

  1. methods inside class的地址(hashcode)是不会变的
  2. methods inside extension of class的地址是会变的,这说明dart里的extension中方法的实现机制可能是:在引用时创建一个匿名函数,临时分配地址

为什么坑人

如果想用extension做代码拆分的任务(虽然也有可能是这个初衷就存在问题,本来就不应该用extension做代码拆分),往extension里写入了一些你本来认为是「静态函数」的函数,认为引用的地址不会变。

比如

1
2
3
4
somePublisher.addListener(helloworldOnExtension)

// then
somePublisher.removeListener(helloworldOnExtension) // doesn't work

此时removeListener不会起作用,因为此时的helloworldOnExtension又是一个新的地址。

结论

少用extension(

关于dart里面的方法调度

如果将最开始的代码第二行改为

1
final dynamic x = _111();

运行时会抛出error:

1
Uncaught TypeError: x.get$helloworldOnExtension is not a functionError: TypeError: x.get$helloworldOnExtension is not a function

这也侧面印证了dart里extension函数是动态生成的,并不存在于函数表里。

来到dart类里面的函数、变量查找机制。

即使是dynamic类型只要调用的方法名存在与该类,dart就能找到并调用对应的方法。

这说明dart可能用的是和OC一样的消息传递调用方法的机制,如上也可以看出来,通过将helloworldOnExtension发送给x.get来完成方法调用。

分析Getx的响应式状态管理

你说的对,但是Getx是Flutter中的一个状态管理库,它可以帮助开发者更容易地管理Flutter应用程序中的状态,控制应用程序的生命周期和路由导航。同时,它还提供了很多实用工具,如国际化、依赖注入、路由管理、文件管理等功能。相较于其他状态管理库,Getx 开发起来更加简单,代码量更小,性能更高,在Flutter社区中也受到了广泛的关注和好评。

Read more »

假设每个message有个seq字段,唯一的代表先后的序号;

有数据库本地存储messages,只能保证储存了某一连续段的数据(或没有),每次可以选择取出开头为seq-1长为len的消息块,也就是seq-1~seq-len的消息;

远端http pull的messages永远是最新的,每次可以选择取出开头为seq-1长为len的消息块。

现在有个从大seq到小的消息list需要维护。

Read more »

关于DH密钥交换协议

现在有一个client-A和server-B,client想要连接到server-B

figure-1

如图

  1. client 首先随机一个大素数p,然后得到该p的原根g,这俩作为公钥在internet上交换。再生成一个随机数a(0<a<p-1,大于等与p-1会回到起点)作为私钥,计算$A=g^a\mod p$,将p、g、A一并发送给server。此即handshake-request。
  2. server收到request后,也随机选择一个随机数b(同a)作为私钥,发送$B=g^b\mod p$ 回client,并计算自己最终的私钥为$key=A^b\equiv g^{ab}\mod p$。此即handshake-reply。client收到reply后也确定 $key=B^a\equiv g^{ab}\mod p$,密钥交换完成,连接建立。

连接建立后,双方互相传输通过key加密的消息。

Read more »

MC 服

RLCraft,原地址

下载

curseforge https://www.curseforge.com/minecraft/modpacks/rlcraft/files/3655670

HMCL导入压缩包即可。

输入服务器地址 xhzq233.tpddns.cn , 来一起玩吧!