mu's blog

Work smart. Have fun.

0%

我们几个小孩头天约好第二天要去钓龙虾
所以晚上那一觉是带点甜的

睡到太阳照屁股,起床随口吃一点
拿上不锈钢水桶就出门
先去抓田鸡或癞蛤蟆
夏天小渠边捉田鸡和癞蛤蟆并不是难事
往往不一会儿就能捉到够
接着就是剥皮,系钩
我们几个小孩,每个人制几个钓钩
这些钓钩是芦柴杆和奶奶补衣服用的白线做成的
等钩系好肉饵放进池塘里,瞪大眼睛等着食客

用不了多久,有杆子被拖动
一手慢慢又慢慢往上提杆,一手拿着网兜
在龙虾出水面的那瞬间变会落入网兜中,进而到了水桶里
有些龙虾不用网兜直接拎着杆进桶
连进桶了还不松口
不知道你知不知道,这是你的断头饭啊

夏天池塘里龙虾太多了
常常我们需要互相帮忙着收杆才来得及
也不会贪多,看桶里差不多了就提桶各回各家
大人们会仔细挨个去筋、洗刷干净
待到中午和晚上必定个个吃的手嘴流油
吮指都香

所以等我长大成人后
每到夏天,尽管还喜欢吃龙虾
也是很少去店里吃的
管它是蒜蓉、麻辣还是十三香

![《流浪地球》](https://i.loli.net/2019/07/30/5d4017b65a82c30600.png)

  还没时间去看电影之前,趁热,读完了《流浪地球》小说。

  小说不长的,在kindle上刚打开的时候,有提示“topical time to read:Less then 1 hour”。从结果看,我算是拖后腿了,加起来前后用了差不多两个小时才读完。

  书里描述到的事物,不少是我难以理解甚至想象。诸如常出现的「光年」,概念我们都知道,是光在真空中一年时间内传播的距离。可是呢,我没法真的理解它,更不要说“充满等离子体光柱的巨大宫殿”、“重元素聚变”和“氦闪”等了。我能做的只是在不懂的时候停下多想一下。

Read more »

你是我粥一般的爱人 余生只够爱的一个人

有时你让我说爱你
我沉默…
沉默…
“爱你”
你动情的笑

你知不知道
我不爱说爱
因为总觉得说出来的不够

– 2019.02.14 于地铁

创建一个新的 Stateless 或者 Stateful widget

只需输入stless即可创建一个像这样的Stateless widget:

快速创建一个 Stateless Widget

或者输入stful来快速创建一个Stateful widget:

快速创建一个 Stateful Widget

如果想从已经建好的Stateless widget转换成Stateful widget,该怎么做呢?我之前的做法是快速新建一个同名的Stateful widget,然后手动copy、paste之前的代码。虽然也可以,就是有点慢。这里其实有个更高效的办法实现。

您可以将光标放在StatelessWidget上,按Alt + Enter快捷键(Windows和Mac一样)并单击Convert to StatefulWidget就可以了。

Read more »

步骤

  1. 在项目根目录下创建一个i10n-arb目录,该目录用于保存arb文件
  2. 在lib目录下创建一个i10n的目录,该目录用于保存从arb文件生成的dart代码文件。
  3. 在i10n目录下面,创建一个localization_intl.dart 文件,用来实现Localizations和Delegate类
  4. 在localization_intl.dart 文件中添加需要国际化的属性
  5. flutter packages pub run intl_translation:extract_to_arb --output-dir=i10n-arb lib/i10n/localization_intl.dart 通过这个intl_translation命令把项目中Intl API标识的属性和字符串生成arb文件
  6. 基于上面生成的arb文件,创建其它我们想支持的语言对应的arb文件
  7. flutter packages pub run intl_translation:generate_from_arb --output-dir=lib/i10n --no-use-deferred-loading lib/i10n/localization_intl.dart i10n-arb/intl_*.arb 根据arb生成dart文件

说明

官方的教程中第五步和第七步有用到两个命令:

flutter packages pub run intl_translation:extract_to_arb --output-dir=i10n-arb lib/i10n/localization_intl.dart

1
2
3
4
5
6
7
8
9
{
"@@last_modified": "2019-01-26T11:14:10.582986",
"login": "Login",
"@login": {
"description": "Title for left drawer login text",
"type": "text",
"placeholders": {}
}
}

这个是生成的默认的Locale资源文件,如果我们现在要支持中文简体,只需要在该文件同级目录创建一个”intl_zh_Hans.arb”文件。

然后将”intl_messages.arb”的内容拷贝到”intl_zh_Hans.arb”文件,接下来将英文翻译为中文即可,翻译后的”intl_zh_Hans.arb”文件内容如下:

1
2
3
4
5
6
7
8
9
10
{
"@@last_modified": "2019-01-26T11:27:30.905630",
"@@locale":"zh-Hans",
"login": "登录",
"@login": {
"description": "Title for left drawer login text",
"type": "text",
"placeholders": {}
}
}

flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/i10n --no-use-deferred-loading lib/i10n/localization_intl.dart i10n-arb/intl_*.arb

感受

经过学习实践官方的国际化方案后,我觉得相对还是有点复杂了。需要dart转arb,arb再转一次dart。对于没有开发过原生app的新手来说,也不是很直观的理解其中的逻辑。

基于上面原因,我目前发现了一些其它方案,

  • 基于 Flutter i18n IDE插件,按照插件提供的文档去实现国际化。
    • 这样步骤和逻辑都相对简单些。这个插件也是基于官方的教程逻辑实现的,只是将一些步骤通过插件替代了,主要的作用是省略dart转arb这步。
  • 基于 fluintl 库实现

参考链接

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
NSString *identifier = [[NSLocale currentLocale] localeIdentifier];
NSString *displayName = [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:identifier];

NSString *udfLanguageCode = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"][0];
NSString *pfLanguageCode = [NSLocale preferredLanguages][0];
NSString *localeLanguageCode = [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
NSString *language = [[NSBundle mainBundle] preferredLocalizations][0];

NSLog(@"%@", identifier);
NSLog(@"%@", displayName);

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"]);
NSLog(@"%@", udfLanguageCode);

NSLog(@"%@",[NSLocale preferredLanguages]);
NSLog(@"%@", pfLanguageCode);
NSLog(@"%@", localeLanguageCode);
NSLog(@"%@", language);
Read more »

  刚去电信营业厅把我的177手机号给注销掉了。2015年我们搬到中宇花苑这边,装修好安装宽带的时候我选择办理的电信纯宽带业务。去年为了升级到电信宽带200M,考虑到电信宽带和电信手机套餐绑定一起使用会划算些就有了这个177手机号。一年合约,每个月¥199套餐费,含200M宽带+700分钟通话+无限流量。

Read more »

  下班回家的地铁中,在 iPhone 上打开了 YouTube app,不知道它喜好算法是怎么做的,给我推荐了一个MV视频合集。我点开后从第一首开始播放。

Read more »