
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 ,我自己觉得比命令行好用就行。
自己画的图标:
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()) 1 selca Apr 9 相当于给 flutter 加了个 python-wrapper ?挺有意思,dart 实在太糟糕了 |
2 newtype0092 Apr 9 这是又一个 flet ? |
3 yangyuan OP @newtype0092 一定程度上是的。 但 Flet 其实不是 1:1 复现,是按照作者设计重写了 contract ,所以在性能/行为上,依赖作者认知。 Flet 我尝试很多次,我最后都选择用 tk 做 UI 。真的做点东西,容易被 flet 自身的问题卡住。 flet 不见起色是我开始 flut 的主要动机之一。 |
4 swim2sun Apr 9 很有意思,但可能不会有太大市场,毕竟现在都是 AI 写代码,训练数据都是 Dart 写的 flutter ,用 Python 反而增加风险 |
5 yangyuan OP @swim2sun 嗯 没有背景,这样的 lib 不会一下子说服很多人用,也不会有很多训练数据,不能指望奇迹。 我是另一个思路: 市场角度,看 python/UI 是不是钢需。 AI 角度上,我希望 AI 能够天生复用 Dart/Flutter 的技能来写 Flut 。所以 Flut 在 API 设计上,实现上,严格遵照 Flutter 原生。连 async/线程管理都是严格按照原生设计,尽量避免 Python 层带来的可能影响。 如果 Flut 哪天真的有问题变成瓶颈,已经写好的代码可以直接 1:1 翻译成 Dart 代码。( Flet 不行,因为 Flet API 不是原生 Flutter API ,迁移不是无脑的。) |