Fair icon indicating copy to clipboard operation
Fair copied to clipboard

从js中获取数据不对

Open zmtzawqlp opened this issue 2 years ago • 15 comments

获取的是空的map, js 端用 plugin 传过来是有 map。

但是 https://github.com/wuba/Fair/blob/4b192672bf5513574dd8b36bae1e96bb075fa055/fair/lib/src/internal/bind_data.dart#L90 这个地方返回的是 空map

@FairPatch()
class SugarDemo extends StatefulWidget {
  const SugarDemo({
    super.key,
    required this.fairProps,
  });

  final Map<String, dynamic> fairProps;

  @override
  State<SugarDemo> createState() => _SugarDemoState();
}

class _SugarDemoState extends State<SugarDemo> {
  @FairProps()
  var fairProps;
  final String _pageName = '#FairKey#';
  var _list = [];
  @override
  void initState() {
    super.initState();
    fairProps = widget.fairProps;
    onLoad();
  }

  void onLoad() {
    _list.add({'ddd': 1});
    setState(() {});
  }

  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('test'),
      ),
      body: Column(
        children: Sugar.map<Widget, dynamic>(_list, builder: (item) {
          return Text('$item');
        }),
      ),
    );
  }
}

zmtzawqlp avatar Apr 13 '23 05:04 zmtzawqlp

class 中的build 方法一般都是布局相关,dart2js在编译过程中把这个方法默认排除了。所以样例中的build 方法其实并没有参与编译。

ghy511024 avatar Apr 23 '23 09:04 ghy511024

_list.add({'ddd': 1}); 是执行了的。。问题是获取的值是空 map

zmtzawqlp avatar Apr 23 '23 11:04 zmtzawqlp

@FairPatch()
class SugarDemo extends StatefulWidget {
  const SugarDemo({
    super.key,
    required this.fairProps,
  });

  final Map<String, dynamic> fairProps;

  @override
  State<SugarDemo> createState() => _SugarDemoState();
}

class _SugarDemoState extends State<SugarDemo> {
  @FairProps()
  var fairProps;
  final String _pageName = '#FairKey#';
 
  @override
  void initState() {
    super.initState();
    fairProps = widget.fairProps;
  }

  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('test'),
      ),
      body:  Text('$fairProps')
      
    );
  }
}

更简单的例子,从外部传进来的参数 fairProps,直接显示也是空 map

zmtzawqlp avatar May 04 '23 10:05 zmtzawqlp

你怎么传的,生成的js是怎么样的要贴出来看看

yx-mike avatar May 19 '23 07:05 yx-mike

你怎么传的,生成的js是怎么样的要贴出来看看

最简单的 map {"xx":1}

zmtzawqlp avatar May 19 '23 08:05 zmtzawqlp

GLOBAL["#FairKey#"] = (function (__initProps__) {
  const __global__ = this;
  return runCallback(function (__mod__) {
    with (__mod__.imports) {
      function _SugarDemoState() {
        const inner = _SugarDemoState.__inner__;
        if (this == __global__) {
          return new _SugarDemoState({ __args__: arguments });
        } else {
          const args =
            arguments.length > 0 ? arguments[0].__args__ || arguments : [];
          inner.apply(this, args);
          _SugarDemoState.prototype.ctor.apply(this, args);
          return this;
        }
      }
      _SugarDemoState.__inner__ = function inner() {
        this.fairProps = __initProps__;
        this._pageName = "#FairKey#";
      };
      _SugarDemoState.prototype = {
        initState: function initState() {
          const __thiz__ = this;
          with (__thiz__) {
            fairProps = widget.fairProps;
          }
        },
      };
      _SugarDemoState.prototype.ctor = function () {};
      return _SugarDemoState();
    }
  }, []);
})(convertObjectLiteralToSetOrMap(JSON.parse("#FairProps#")));

zmtzawqlp avatar May 19 '23 08:05 zmtzawqlp

参数: { 'fairProps': jsonEncode({ 'title': 'Fair Page', }) }

读取: String getTitle() { return fairProps['title']; }

你再发一下你的生成的json看看

yx-mike avatar May 19 '23 08:05 yx-mike

不是读取。读取对的。。而且是 获取整个 map

zmtzawqlp avatar May 19 '23 08:05 zmtzawqlp

{
  "className": "Scaffold",
  "na": {
    "appBar": {
      "className": "AppBar",
      "na": {
        "title": {
          "className": "Text",
          "pa": [
            "test"
          ]
        }
      }
    },
    "body": {
      "className": "Text",
      "pa": [
        "#($fairProps)"
      ]
    }
  },
  "methodMap": {}
}

zmtzawqlp avatar May 19 '23 09:05 zmtzawqlp

不是读取。读取对的。。而且是 获取整个 map

我debug了一下,应该是解析类型变了。

lib/src/render/expression.dart

不同的写法,可能走的Expression不同。

确实不能像你那样直接获取整个fairProps。

yx-mike avatar May 19 '23 09:05 yx-mike

不是读取。读取对的。。而且是 获取整个 map

个人觉得,UI和数据逻辑最好分开,数据逻辑都用js部分实现,通过方法。

yx-mike avatar May 19 '23 09:05 yx-mike

第一个列子里面,也是。那种也不支持。 网络请求之后。自己增加一些对象,不是很正常的操作吗

zmtzawqlp avatar May 19 '23 09:05 zmtzawqlp

第一个列子里面,也是。那种也不支持。 网络请求之后。自己增加一些对象,不是很正常的操作吗

一样的,你的item是个Map,你需要创建一个对象通过属性去读取(item.ddd),里面的值。

Fair有demo的,你可以去找找。

yx-mike avatar May 19 '23 10:05 yx-mike

第一个列子里面,也是。那种也不支持。 网络请求之后。自己增加一些对象,不是很正常的操作吗

一样的,你的item是个Map,你需要创建一个对象通过属性去读取(item.ddd),里面的值。

Fair有demo的,你可以去找找。

你说的都知道,数组对象不能直接传递到 dart 这边,体验很差呢

zmtzawqlp avatar May 19 '23 10:05 zmtzawqlp

第一个列子里面,也是。那种也不支持。 网络请求之后。自己增加一些对象,不是很正常的操作吗

一样的,你的item是个Map,你需要创建一个对象通过属性去读取(item.ddd),里面的值。 Fair有demo的,你可以去找找。

你说的都知道,数组对象不能直接传递到 dart 这边,体验很差呢

哈哈哈哈,又不是完全的动态化。Fair就是UI和逻辑的动态化是分开,不能在UI中执行逻辑代码,没办法的。DSL+JS。 除非像北海那样。

我在开发中也觉得很烦,开发成本还是比较大的,数据转来转去很烦。我现在有什么问题和不爽,都自己去改,不用官方的分支

yx-mike avatar May 19 '23 10:05 yx-mike