游牧周记第43期
日常
阳台种植
新买了一些东西:
- 2颗来自德宏的树莓苗,一颗黑色一颗红色,但只是苗,我分不出,分别用两个盆栽上,看来品质还行。
- 一带(10斤)云南森林腐叶土,纯黑色,希望可以弥补有些植物酸性不足和肥少的问题(以前买的营养土似乎太寡淡了...)。
- 苦楝油和皂液,混装加水后用,但最近似乎没发现红蜘蛛和虫害了。
Diablo IV s10
最近这个游戏打得有点频繁了,s9一直玩亡灵,但没啥突破,感觉冲层无力,最大的成就是最后几天得到一个4星的堕狱头盔,但赛季也结束了。 9月24日,s10上线,当天又以熟悉的亡灵试玩,一口气冲到55。现在大家都说新赛季德鲁伊最好玩,于是第二天改小德,2天打到凌晨,60(153)级,早中期的拍拍装配齐,感觉攻击力确实可以,但会暴毙,最大的问题是我们玩惯了纯招单手逛街的人,觉得有点腰酸背痛了,等凑齐装备,下次改渡鸦流派,看会否轻松点。
出行
高铁去老挝计划
原计划国庆假期后触发,后来又有点急想再提早两 天。 办签证有2个方法,在网上电子签或到昆明的领事馆办。
领事馆据说最近热门到要排队,要实现拍摄合适的2寸白底照片,带上身份证等一堆证件,估计300多块钱/人手续费。 那是不是电子签好点呢?我开始也这么想,于是上了https://laoevisa.gov.la,填写了一些内容,上传以前的证件照和护照照片,每人收费36usd(看似便宜很多),正要提交,突然想起一个问题:如果填写有误,可以修改吗,会不会退钱?没地方问就问了GPT,结果是否的,听说照片要求6个月以内拍的,一些文字细节也不能出错,我真的担心可能过不了,那就打水飘了。 考虑良久,还是下楼找个小店拍照了,多年前去泰国也是这家拍的签证照。 原计划第二天就去领事馆,后来突然想改晚点去(比如11月),主要还是因为今年出游较多,有点倦怠了,琅勃拉邦一个地方对我的吸引力有限(真有趣的反而是高铁),旅行目标还不明确,就再等等吧。
开发
Unistyles的theme切换太懒了怎么办
上周解决了整体theme切换的问题,这周发现复杂点的app,部分页面和组件不更新,特别是tabs中和list中,ChatGPT给了个直接又简单的方案。如下:
问题其实是 react-native-unistyles v3+ 在 Expo SDK 54 里切换主题时,部分组件没有重新刷新。
这是因为 UnistylesRuntime.setTheme() 并不会强制触发整个 React 树的 re-render,尤其是被缓存的 screen / VirtualizedList item。
1. 为什么会发生
-
Tabs 场景:React Navigation 默认会缓存 tab screen,不会因为 theme 改变而自动 unmount/remount。
-
FlatList 场景:子项渲染由
renderItem
控制,如果 item 的key
和 props 没变,React 不会 re-render。 -
UnistylesRuntime 的限制:调用
setTheme
实际只是更新内部 runtime theme,只有订阅 hook(useStyles
,useTheme
)的地方才会触发 re-render。
2. 常见坑
-
你用了
UnistylesRuntime.setAdaptiveThemes(true/false)
,但如果之前的组件挂载时拿到的 theme 是“老的”,它不会自动更新。 -
React Navigation tab 屏幕缓存(默认
lazy
、unmountOnBlur: false
),不会重新构建。 -
FlatList 的 item 如果不依赖 theme 作为
extraData
,不会刷新。
3. 解决方案
✅ 方法 A:确保 theme 改变能触发 re-render
const theme = useTheme(); // Unistyles hook
<FlatList
data={data}
renderItem={renderItem}
extraData={theme.name} // 强制当 theme.name 变化时刷新
/>
✅ 方法 B:给 Navigation 强制刷新
React Navigation 可以利用 key
来强制重新挂载:
<Tab.Navigator
key={theme.name} // 当 theme 变化时,强制整个 Tab.Navigator 重建
>
...
</Tab.Navigator>
或者在 _layout.tsx
根节点:
const theme = useTheme();
return (
<Stack key={theme.name}>
{/* theme 改变时整个 Stack 重新渲染 */}
</Stack>
);