Flut, 用 Python 写 Flutter - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
yangyuan

Flut, 用 Python 写 Flutter

  •  
  •   yangyuan
    yangyuan Apr 9 1254 views

    GitHub: https://github.com/yangyuan/flut/ PYPI: https://pypi.org/project/flut/

    用法

    安装:pip install flut

    // 正常用 Dart 写 Flutter 是这样 Container( padding: EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(8), ), child: Text('Hello'), ) 
    # 在 Python 用 Flut 就是这样 Container( padding=EdgeInsets.all(16), decoration=BoxDecoration( color=Colors.blue, borderRadius=BorderRadius.circular(8), ), child=Text('Hello'), ) 

    原始的 Flutter contract ,执行时被映射到 flutter 真实的代码。所以是真实的 Flutter 在运行。

    这是针对桌面的 SDK ,目标不是一个发布产品的 SDK 而是一个快速做点小桌面应用的包。

    比如:学生的大作业,科研做点小 demo ;需要 Python 又想要有个不需要配置的 UI ,这样的场景。再比如我自己用这个做了个本地桌面 Agent ,我自己觉得比命令行好用就行。

    • 设计上,原则是原生 1:1 对应,Python 这边写的啥样,就在 Flutter 这里 1:1 照搬执行。
    • 异步集成设计上基本遵照了 Libuv ,Electron ,Chromium 的做法,不敢说没 bug, 但设计绝对是产品级的。
    • 性能上,FFI 期间的确需要序列化,会带来理论上的损失。实际执行上,只要设备不太差,性能损失和事件延时是无感的。我 4 年老本上维持 120hz 动画和无延时拖拽,Catalog 里有一些样例。
    • 内存生命周期上,以及 flutter 覆盖度上,还有很大改进空间。

    自己画的图标:

    flut

    catalog app https://github.com/yangyuan/flut/tree/master/examples/catalog 做的比较粗糙,但主要能看常见支持的功能。

    一个简单但完整能跑的例子:

    from flut import run_app from flut.flutter.widgets import StatelessWidget, StatefulWidget, State, Text, Center, Column, Icon from flut.flutter.material import MaterialApp, Scaffold, AppBar, FloatingActionButton, Icons, ThemeData, ColorScheme, Colors, Theme from flut.flutter.rendering import MainAxisAlignment class MyApp(StatelessWidget): def build(self, context): return MaterialApp( title="Flut Demo", theme=ThemeData( colorSchee=ColorScheme.fromSeed(seedColor=Colors.deepPurple), ), home=MyHomePage(title="Flut Demo Home Page"), ) class MyHomePage(StatefulWidget): def __init__(self, title): super().__init__() self.title = title def createState(self): return _MyHomePageState() class _MyHomePageState(State[MyHomePage]): def initState(self): self._counter = 0 def _incrementCounter(self): def _update(): self._counter += 1 self.setState(_update) def build(self, context): return Scaffold( appBar=AppBar( title=Text(self.widget.title), backgroundColor=Theme.of(context).colorScheme.inversePrimary, ), body=Center( child=Column( mainAxisAlignment=MainAxisAlignment.center, children=[ Text("You have pushed the button this many times:"), Text( f"{self._counter}", style=Theme.of(context).textTheme.headlineMedium, ), ], ), ), floatingActiOnButton=FloatingActionButton( OnPressed=self._incrementCounter, tooltip="Increment", child=Icon(Icons.add), ), ) if __name__ == "__main__": run_app(MyApp()) 
    5 replies    2026-04-10 01:31:06 +08:00
    selca
        1
    selca  
       Apr 9   1
    相当于给 flutter 加了个 python-wrapper ?挺有意思,dart 实在太糟糕了
    newtype0092
        2
    newtype0092  
       Apr 9
    这是又一个 flet ?
    yangyuan
        3
    yangyuan  
    OP
       Apr 9
    @newtype0092 一定程度上是的。
    但 Flet 其实不是 1:1 复现,是按照作者设计重写了 contract ,所以在性能/行为上,依赖作者认知。
    Flet 我尝试很多次,我最后都选择用 tk 做 UI 。真的做点东西,容易被 flet 自身的问题卡住。

    flet 不见起色是我开始 flut 的主要动机之一。
    swim2sun
        4
    swim2sun  
       Apr 9
    很有意思,但可能不会有太大市场,毕竟现在都是 AI 写代码,训练数据都是 Dart 写的 flutter ,用 Python 反而增加风险
    yangyuan
        5
    yangyuan  
    OP
       Apr 10
    @swim2sun

    没有背景,这样的 lib 不会一下子说服很多人用,也不会有很多训练数据,不能指望奇迹。


    我是另一个思路:

    市场角度,看 python/UI 是不是钢需。

    AI 角度上,我希望 AI 能够天生复用 Dart/Flutter 的技能来写 Flut 。所以 Flut 在 API 设计上,实现上,严格遵照 Flutter 原生。连 async/线程管理都是严格按照原生设计,尽量避免 Python 层带来的可能影响。
    如果 Flut 哪天真的有问题变成瓶颈,已经写好的代码可以直接 1:1 翻译成 Dart 代码。( Flet 不行,因为 Flet API 不是原生 Flutter API ,迁移不是无脑的。)
    About     Help     Advertise     Blog     API     FAQ     Solana     5677 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 72ms UTC 08:15 PVG 16:15 LAX 01:15 JFK 04:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86