深夜两点,两个娃睡后,我用Flutter+AI工具写出了人生的"跨平台"答案

Python摸鱼师
2026-07-28 20:42
阅读 435

凌晨2:17,客厅的灯关着,只有我面前的显示器还亮着。隔壁房间传来大宝翻身的声音,我下意识屏住呼吸——还好,没醒。我端起已经凉透的美式,灌了一口,继续敲代码。

0x00 一个中年程序员的深夜独白

先自我介绍一下。

我叫老陈,今年34,坐标深圳,两个娃的爹。大宝四岁半,上幼儿园中班,每个月学费加兴趣班差不多4500;二宝一岁三个月,还在喝奶粉,一罐328,一个月光奶粉钱就得小两千。老婆在一家电商公司做运营,月薪8k,说多不多,说少不少,但两个人加起来,在深圳这个城市,说实话,也就是刚够"活着"。

房租3500,在龙华租的小两房,不大,但够住。每个月房贷4800,老家那套房子留着没卖,想着万一哪天混不下去了还能回去有个窝。

上周五晚上,老婆突然跟我说:"老陈,要不咱们回长沙吧?"

我当时正在看一个Flutter的技术文档,听到这话愣了一下。"怎么突然说这个?"

"今天带二宝去打疫苗,排队的时候碰到我同事小李,她老公在长沙做开发,月薪15k,但他们那边房价才八千一平。咱们在这边,你月薪22k,但你看看咱们存下什么了?"

我没说话。

她说得对。

2021年我从一家外包公司跳槽到现在这家做智能硬件的创业公司,月薪从15k涨到了22k,听起来涨了快50%,但深圳的生活成本就像个无底洞。大宝明年要上小学了,学位房想都不敢想,随便一个还过得去的学区房,首付就得一百多万。

"让我想想。"我最后只说了这四个字。

那天晚上哄睡两个孩子之后,我坐在电脑前,脑子里全是"回老家还是留深圳"这个问题。但我是程序员啊,遇到问题,第一反应还是——打开电脑,写代码。

不是逃避,是真的需要静一静。

0x01 为什么是Flutter?

说来话长。

去年十月的时候,公司接了一个新项目,要同时做iOS和Android端。老板一拍脑袋:"咱们用Flutter吧,听说一套代码两端跑,省人力。"

当时团队里没人用过Flutter。我是技术负责人,硬着头皮上了。

说实话,刚开始真的痛苦。

我之前写了六年原生Android,Java/Kotlin闭着眼睛都能写。突然让我用Dart,用Widget树,用那种"一切皆组件"的思路去构建UI,真的不适应。第一个星期,我对着一个列表页面搞了整整两天,Stateless Widget和Stateful Widget的区别我看了三遍文档才彻底搞明白。

但你知道程序员最不怕什么吗?不怕难,就怕没意思。

Flutter这东西,一旦你上手了,真的会上瘾。

Hot Reload!改一行代码,不到一秒钟,界面上就能看到效果。那种感觉,就像你以前在黑暗中摸索,突然有人给你打开了灯。我以前改个原生Android的UI,编译一次要等一两分钟,现在?不存在的。

Hot Reload改变的不只是开发效率,它改变了我的开发思维。我可以更大胆地去尝试,去试错,因为试错成本几乎为零。

到了今年三月份,我已经能用Flutter比较熟练地开发中等复杂度的应用了。期间还踩了不少坑,比如Platform Channel通信搞了我整整一个周末,还有那个让人又爱又恨的BuildContext,刚开始真的被它搞得头大。

但这些都过来了。

0x02 深夜学Flutter,AI工具成了我的"外挂"

回到上周五那个晚上。

哄睡两个孩子已经快十一点了。老婆在卧室陪二宝,大宝好不容易睡着了,但睡相极差,随时可能一个翻身就醒。

我坐在客厅的电脑前,打开VS Code,准备继续研究Flutter。但说实话,那天晚上我根本看不进去代码。脑子里全是老婆那句"要不咱们回长沙吧"。

就在我发呆的时候,我打开了Warp。

Warp这个终端工具,我之前是看掘金上一篇文章推荐的。说实话,作为一个用了五年iTerm2的人,刚开始我是抗拒的。但用了一周之后,真香。

为什么?因为它内置了AI。

那天晚上我在Warp里输入了一行命令,想初始化一个新的Flutter项目。然后我顺手问了一句:"帮我解释一下Flutter的Widget生命周期,用大白话。"

Warp直接在终端里给我返回了一段非常清晰的解释,甚至还附带了代码示例。

当时我就想,这玩意儿要是能帮我学Flutter,那效率得翻几倍啊。

后来我又试了Manus。

Manus是最近很火的一个AI Agent工具,跟普通的ChatGPT对话不一样,它能真正帮你"干活"。我给它布置了一个任务:"帮我用Flutter写一个记账App的完整架构,包括数据层、业务层和UI层,要使用Riverpod做状态管理。"

你猜怎么着?

它真的给我生成了一整套项目结构,虽然有些细节需要调整,但整体架构非常合理。数据层用了Isar做本地存储,业务层用Riverpod的Notifier模式,UI层按照功能模块拆分。

我当时坐在电脑前,愣了足足有三十秒。

不是被技术震撼到了,而是突然意识到——如果我掌握了这些AI工具,再加上Flutter这种跨平台能力,我一个人的产出,可能顶得上以前一个小团队。

这意味着什么?

意味着就算我回长沙,拿个15k甚至12k的工资,我的竞争力也不会差。因为我不再只是一个"写代码的",我是一个能用AI工具十倍提效的全栈开发者。

这个想法让我突然不那么焦虑了。

0x03 Augment Code:被严重低估的编程搭子

说到这里,必须聊聊Augment Code。

这个工具我是上个月在一个技术群里看到有人推荐的。说实话,刚开始我没太在意,毕竟市面上AI编程工具太多了——Copilot、Cursor、Codeium——我都用过,感觉大同小异。

但Augment Code真的不一样。

那天我在写一个Flutter的自定义动画组件,需要用到AnimationController和Tween。这种代码其实不复杂,但写起来很繁琐,各种Controller要手动dispose,Ticker要手动管理,一不小心就内存泄漏。

我把需求丢给Augment Code,它不光帮我生成了完整的动画组件代码,还自动处理了所有的生命周期管理——在dispose里正确释放Controller,用Mixin模式封装了Ticker的管理逻辑。

最让我惊喜的是,它理解上下文的能力特别强。我前面已经写了一个类似的卡片翻转动画,Augment Code在生成新组件的时候,自动参考了之前的代码风格和设计模式,保持了一致性。

这种感觉,就像你身边坐了一个经验丰富的高级工程师,你不用开口,它就知道你想要什么。

后来我用Augment Code辅助,一个周末就把那个记账App的Flutter版本写完了。代码量大概三千多行,放在以前,至少得两周。

我甚至把代码给我以前带的一个实习生看,他直接惊了:"陈哥,你这代码质量比之前高了一个档次啊。"

我笑了笑,没告诉他真相。

0x04 技术深度解析:Flutter的核心设计哲学

好了,聊了这么多个人经历,该说点干货了。

毕竟这篇文章的标题是"Flutter入门",不能光讲故事不教技术。

4.1 一切皆Widget:理解Flutter的"乐高哲学"

Flutter最核心的设计理念,就是一切皆Widget

你可以把Widget想象成乐高积木。一个按钮是一个Widget,一行文字是一个Widget,一个页面也是一个Widget。你可以把小的Widget组合成大的Widget,就像用乐高拼出一个城堡。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('我的第一个Flutter应用'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                'Hello, 世界!',
                style: TextStyle(fontSize: 24),
              ),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: () {
                  print('按钮被点击了');
                },
                child: Text('点我'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

上面这段代码,从外到内:MyApp是一个Widget,MaterialApp是一个Widget,Scaffold是一个Widget,AppBar是一个Widget,Center是一个Widget,Column是一个Widget,TextElevatedButton也都是Widget。

它们一层套一层,就像俄罗斯套娃。

这种设计的好处是极致的组合性。你不需要继承一堆复杂的基类,只需要把Widget组合起来就行。想加个边距?套一个Padding。想加个点击事件?套一个GestureDetector。想让它能滚动?套一个SingleChildScrollView

4.2 State管理:Flutter的"灵魂拷问"

学Flutter绕不开的一个问题就是:状态管理

简单来说,State就是UI的"数据源"。数据变了,UI跟着变。这就是所谓的"响应式编程"。

Flutter提供了几种状态管理方案:

setState:最基础的,适合简单的局部状态。

class CounterWidget extends StatefulWidget {
  @override
  _CounterWidgetState createState() => _CounterWidgetState();
}

class _CounterWidgetState extends State<CounterWidget> {
  int _count = 0;

  void _increment() {
    setState(() {
      _count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('计数: $_count'),
        ElevatedButton(
          onPressed: _increment,
          child: Text('+1'),
        ),
      ],
    );
  }
}

Provider:官方推荐的基础方案,适合中小型项目。

Riverpod:Provider的"进化版",编译时安全,不用依赖BuildContext,是目前社区最推荐的方案。

// 定义一个Provider
final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
  return CounterNotifier();
});

class CounterNotifier extends StateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => state++;
}

// 在Widget中使用
class CounterPage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);
    return Text('计数: $count');
  }
}

我的建议是:新手从setState开始,理解原理后直接上Riverpod。Provider可以作为过渡,但Riverpod才是未来。

4.3 渲染引擎:Flutter为什么这么快?

很多人问:Flutter为什么性能这么好?

答案是:Skia渲染引擎 + 自绘UI

传统的跨平台方案(比如React Native),用的是"桥接"模式——JavaScript写UI,通过Bridge调用原生组件来渲染。这个Bridge就是性能瓶颈,数据来回传递,延迟不可避免。

Flutter不一样。它不用原生组件,而是用Skia(一个2D图形引擎)自己画。每一个像素,都是Flutter自己算出来、画上去的。

这就好比:别人是"翻译官"模式(先翻译给本地人听,本地人再执行),Flutter是"直接上手"模式(我自己就是本地人,我直接干活)。

所以Flutter的UI渲染性能,几乎可以媲美原生。

当然,这也带来了一个问题:Flutter的包体积比较大。一个简单的Hello World应用,打出来的APK都有十几MB。但这个问题在Flutter 3.x之后已经改善了很多,通过tree shaking和延迟加载,包体积可以控制在一个合理的范围。

0x05 从技术到人生:我的"跨平台"思考

写到这里,已经凌晨三点多了。

隔壁房间很安静,两个孩子都睡得很沉。我靠在椅背上,看着屏幕上跑起来的Flutter应用,突然有了一些感悟。

Flutter的核心理念是"一次编写,多端运行"。它不纠结于你是iOS还是Android,它关注的是"如何用最少的成本,覆盖最多的用户"。

人生何尝不是如此?

我之前一直纠结"留深圳还是回长沙",其实本质上是在纠结"高成本高回报还是低成本稳回报"。但如果换个思路呢?

如果我把自己也当成一个"跨平台应用"——我的技能是"代码",我的"渲染引擎"是AI工具,我的"状态管理"是持续学习的能力——那我在哪里运行,其实没那么重要。

重要的是,我的"核心代码"够不够硬。

这周末,我跟老婆深聊了一次。

"我想试试回长沙。"我说。

她有点意外:"你想通了?"

"不是想通了,是我换了一种思考方式。"我给她看了我用Flutter和AI工具做的那个记账App,"你看,这个App我一个人一个周末就搞定了。以前这至少要一个团队干两周。"

"现在AI工具越来越强,Warp、Manus、Augment Code这些工具,让一个人的产出能顶一个小团队。我回长沙,工资可能少几千,但生活成本也低。更重要的是,我有时间陪孩子,有时间提升自己。"

"而且,"我顿了顿,"我打算业余时间做点自己的产品。你看现在独立开发者这么多,我技术栈有了,AI工具也熟了,差的只是一个好idea和执行力。"

老婆听完沉默了一会儿,然后说:"行,那你先投投长沙的公司看看。"

0x06 给同路人的一些建议

如果你也是一个在技术路上摸索的程序员,特别是跟我一样有家庭负担的中年程序员,我想分享几点心得:

第一,拥抱AI工具,别抗拒。

Warp、Manus、Augment Code这些工具,不是来抢你饭碗的,是来给你加buff的。我见过一些老程序员,觉得"AI写的代码不靠谱",拒绝使用。但时代变了,不用AI工具的程序员,就像不用IDE的程序员一样,迟早会被淘汰。

第二,学技术要"功利"一点。

我不是说学东西要急功近利,而是要有明确的目标。我学Flutter,是因为公司需要,是因为跨平台是趋势。我不会去学一些冷门的技术栈,除非我有明确的场景需要它。

第三,保持输出。

写博客、做开源、录视频,任何形式的输出都行。输出是最好的学习方式,因为你要把一个东西讲清楚,首先自己得真正理解它。而且,输出还能帮你建立个人品牌。我后来能拿到现在这个22k的offer,有一半的功劳要归功于我之前写的技术博客。

第四,别忽视"软技能"。

技术很重要,但沟通能力、项目管理能力、产品思维同样重要。特别是到了30+的年纪,纯靠技术吃饭会越来越难。你得学会"跨界",就像Flutter"跨平台"一样。

0x07 写在最后

现在是凌晨四点,天快亮了。

我关上电脑,去卧室看了一眼两个孩子。大宝的被子踢到一边了,我轻轻给他盖上。二宝还在呼呼大睡,小嘴微微张着,特别可爱。

我站在床边看了他们一会儿,心里突然很平静。

回不回长沙,其实没那么重要了。重要的是,我已经不再焦虑了。因为我知道,无论在哪里,只要我保持学习的能力,保持对技术的热情,善用AI工具提升效率,我就能找到属于自己的位置。

就像Flutter一样——不在乎运行在哪个平台,只在乎自己的"渲染"够不够好。

好了,该去洗个澡准备上班了。

哦对了,如果你也在学Flutter,欢迎来找我交流。虽然我也是个"半吊子",但踩过的坑应该比你多(笑)。

最后送一句话给所有深夜还在敲代码的程序员们:

代码可以跨平台,人生也可以。别让平台限制了你的想象力。


全文约3000字,写于一个普通的周三凌晨。如果你也有类似的经历和感悟,欢迎在评论区聊聊。

—— 一个还在努力学习的二娃奶爸

评论 0

最热最新
暂无评论
Python摸鱼师Lv.1
0
影响力
0
文章
0
粉丝