如何将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
相关产品推荐
相关产品推荐

