Flut, 用 Python 写 Flutter

4 月 9 日
 yangyuan

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())

1873 次点击
所在节点    分享创造
5 条回复
selca
4 月 9 日
相当于给 flutter 加了个 python-wrapper ?挺有意思,dart 实在太糟糕了
newtype0092
4 月 9 日
这是又一个 flet ?
yangyuan
4 月 9 日
@newtype0092 一定程度上是的。
但 Flet 其实不是 1:1 复现,是按照作者设计重写了 contract ,所以在性能/行为上,依赖作者认知。
Flet 我尝试很多次,我最后都选择用 tk 做 UI 。真的做点东西,容易被 flet 自身的问题卡住。

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

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


我是另一个思路:

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

AI 角度上,我希望 AI 能够天生复用 Dart/Flutter 的技能来写 Flut 。所以 Flut 在 API 设计上,实现上,严格遵照 Flutter 原生。连 async/线程管理都是严格按照原生设计,尽量避免 Python 层带来的可能影响。
如果 Flut 哪天真的有问题变成瓶颈,已经写好的代码可以直接 1:1 翻译成 Dart 代码。( Flet 不行,因为 Flet API 不是原生 Flutter API ,迁移不是无脑的。)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1204591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX