You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Flutter Dart的.of(context)写法转换为ClojureDart代码

.of(context) 写法在ClojureDart中的对应规则

Dart中类名.of(context)的静态方法调用,在ClojureDart中遵循Clojure的静态方法调用语法,格式为(类名/of context),和调用宿主语言静态方法的规则完全一致。
以示例中的ScaffoldMessenger.of(context)为例,对应ClojureDart写法为(ScaffoldMessenger/of context);如果需要调用获取到的实例的方法,用Clojure的互操作语法即可,比如调用showSnackBar方法的完整写法为:

(.showSnackBar (ScaffoldMessenger/of context) snack-bar-instance)
完整组件ClojureDart实现

你提供的Dart版SnackBarPage,对应ClojureDart实现有两种常见写法:

  • 显式继承StatelessWidget的标准写法
; 命名空间声明需引入flutter/material包
(ns demo.widgets.snack-bar-page
  (:require [flutter/material :as m]))

(def snack-bar-page
  (m/StatelessWidget
    :build (fn [this context]
             (m/Center
               .child (m/ElevatedButton
                        .onPressed (fn []
                                     (let [snack-bar (m/SnackBar
                                                       .content (m/Text "Yay! A SnackBar!")
                                                       .action (m/SnackBarAction
                                                                 .label "Undo"
                                                                 .onPressed (fn []
                                                                              ; 此处编写撤销逻辑
                                                                              )))]
                                       (.showSnackBar (m/ScaffoldMessenger/of context) snack-bar)))
                        .child (const (m/Text "Show SnackBar")))))))
  • 语法糖简化的函数式写法
    ClojureDart提供了简写语法简化无状态组件编写,build上下文会被动态绑定到m/*context*变量,可以直接在组件内部调用:
(defn snack-bar-page []
  (m/Center
    .child (m/ElevatedButton
             .onPressed (fn []
                          (let [snack-bar (m/SnackBar
                                            .content (m/Text "Yay! A SnackBar!")
                                            .action (m/SnackBarAction
                                                      .label "Undo"
                                                      .onPressed (fn []
                                                                   ; 此处编写撤销逻辑
                                                                   )))]
                            (.showSnackBar (m/ScaffoldMessenger/of m/*context*) snack-bar)))
             .child (const (m/Text "Show SnackBar")))))

提示:ClojureDart中Dart的const常量构造,需要用(const (widget构造代码))的形式包裹,和Dart const关键字的编译期常量优化效果完全一致。

内容的提问来源于stack exchange,提问作者Adina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:42:17