指南

    资料

    # # 模板语法【实验】

    以下内容为实验性质,需要手工书写DSL

    有时候书写Widget代码会嵌入一些逻辑运算,目前我们支持了少量的模板语法。为了方便区分,所有模板语法关键词形如:Sugar.xx Fair本身限定了些关键词,书写业务特有代码时请注意规避 - FairWidget - Sugar相关API: - $index - $item ## # ifEqual条件 用于处理二元逻辑判断 语法格式
    1. {
    2. "className":"Sugar.ifEqual",
    3. "pa":["当前值","期望值"],
    4. "pa":{
    5. "trueValue":"条件成立返回值",
    6. "falseValue":"条件不成立"
    7. }
    8. }
    1 2 3 4 5 6 7 8 ### # 示例 根据当前计数器的取值,输出一个文本: 模板语法【实验】 - 图1
    1. Sugar.ifEqual(count, 0,
    2. trueValue: Text('True case, count = 0'),
    3. falseValue: Text("False case, count != 0"))
    1 2 3 等价于
    1. {
    2. "className": "Sugar.ifEqual",
    3. "pa": [
    4. "#($count)",
    5. 0
    6. ],
    7. "na": {
    8. "trueValue": {
    9. "className": "Text",
    10. "pa": [
    11. "True case, count = 0"
    12. ]
    13. },
    14. "falseValue": {
    15. "className": "Text",
    16. "pa": [
    17. "True case, count != 0"
    18. ]
    19. }
    20. }
    21. }
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ## # IfRange条件 当你的条件判断是命中一个目标集合时,单纯If标签使得代码非常冗余。因此我们也支持IfRange条件,用于判断当前值是否在一个集合中。 语法格式
    1. {
    2. "className":"Sugar.ifRange",
    3. "pa":["当前值",["期望值1","期望值2""期望值N"]],
    4. "pa":{
    5. "trueValue":"条件成立返回值",
    6. "falseValue":"条件不成立"
    7. }
    8. }
    1 2 3 4 5 6 7 8 ## # map操作符 循环控制,适用于Widget接受数组的情况,比如Row,Column的children。 语法格式
    1. {
    2. "className":"Sugar.map",
    3. "pa":["数组元素1","数组元素1","数组元素N",
    4. "na": {
    5. "builder": {"className": "SimpleTextItemBuilder"}
    6. }
    7. }
    1 2 3 4 5 6 7 forloop需要通过硬编码的形式实现一个body体函数,例如SimpleTextItemBuilder, 由他控制for的函数体实现。 注册一个函数可以通过FairApp初始化,也可以通过FairWidget初始化。
    1. FairApp(
    2. func: {
    3. 'SimpleTextItemBuilder2': (props) => (text) => Text(text),
    4. }
    5. )
    1 2 3 4 5 ### # 示例 遍历字符串数组,并填充为Row的Text数组 模板语法【实验】 - 图2
    1. Row(children:Sugar.map(["=A=", "=B=", "=C=", "=D="], builder: (e) => Text(e)))
    1 等价于
    1. {
    2. "className": "Row",
    3. "na": {
    4. "children": {
    5. "className": "Sugar.map",
    6. "pa": [
    7. "=A=",
    8. "=B=",
    9. "=C=",
    10. "=D="
    11. ],
    12. "na": {
    13. "builder": {
    14. "className": "SimpleTextItemBuilder"
    15. }
    16. }
    17. }
    18. }
    19. }
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ## # mapEach带索引map操作 如果你的for循环的函数体并不是很复杂,例如只是返回一个Widget,那么可以考虑使用map来提高灵活性。 语法格式
    1. {
    2. "className": "Text",
    3. "mapEach":["A","B","C"],
    4. "pa":["#($item)"]
    5. }
    1 2 3 4 5 mapEach中为数组,引用数组元素可以通过$item,如果要获取当前的索引则通过$index 注意变量需要包裹在#()中以字符串形式书写。 ### # 示例 我们输出一行小方块,索引位0和2的小方块设置为黄页背景,其他设置为红色背景。 模板语法【实验】 - 图3
    1. Row(
    2. mainAxisAlignment: MainAxisAlignment.spaceAround,
    3. children: Sugar.mapEach(
    4. ["A", "B", "C", "D"],
    5. (index, item) => Container(
    6. child: Text('Card $item'),
    7. alignment: Alignment.center,
    8. margin: EdgeInsets.only(top: 30, bottom: 30, right: 10),
    9. color: Sugar.ifRange([0, 2], index,
    10. trueValue: Colors.redAccent, falseValue: Colors.yellow),
    11. width: 60,
    12. height: 60,
    13. ),
    14. ).toList(),
    15. )
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 等价于
    1. {
    2. "className": "Row",
    3. "na": {
    4. "mainAxisAlignment": "#(MainAxisAlignment.spaceAround)",
    5. "children": {
    6. "className": "Container",
    7. "mapEach": [
    8. "A",
    9. "B",
    10. "C",
    11. "D"
    12. ],
    13. "na": {
    14. "child": {
    15. "className": "Text",
    16. "pa": [
    17. "#(Card $item)"
    18. ]
    19. },
    20. "alignment": "#(Alignment.center)",
    21. "margin": {
    22. "className": "EdgeInsets.only",
    23. "na": {
    24. "top": 30,
    25. "bottom": 30,
    26. "right": 10
    27. }
    28. },
    29. "color": {
    30. "className": "Sugar.ifRange",
    31. "pa": [
    32. "#($index)",
    33. [
    34. 0,
    35. 2
    36. ]
    37. ],
    38. "na": {
    39. "trueValue": "#(Colors.redAccent)",
    40. "falseValue": "#(Colors.yellow)"
    41. }
    42. },
    43. "width": 60,
    44. "height": 60
    45. }
    46. }
    47. }
    48. }
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 Bundle资源 Flutter动态化框架Fair的设计与思考