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(
colorScheme=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 20 小时 12 分钟前 相当于给 flutter 加了个 python-wrapper ?挺有意思,dart 实在太糟糕了
|
2
newtype0092 20 小时 8 分钟前
这是又一个 flet ?
|
3
yangyuan OP @newtype0092 一定程度上是的。
但 Flet 其实不是 1:1 复现,是按照作者设计重写了 contract ,所以在性能/行为上,依赖作者认知。 Flet 我尝试很多次,我最后都选择用 tk 做 UI 。真的做点东西,容易被 flet 自身的问题卡住。 flet 不见起色是我开始 flut 的主要动机之一。 |
4
swim2sun 19 小时 34 分钟前
很有意思,但可能不会有太大市场,毕竟现在都是 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 ,迁移不是无脑的。) |