Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

从js中获取数据不对 #280

Open
zmtzawqlp opened this issue Apr 13, 2023 · 15 comments
Open

从js中获取数据不对 #280

zmtzawqlp opened this issue Apr 13, 2023 · 15 comments

Comments

@zmtzawqlp
Copy link
Contributor

zmtzawqlp commented Apr 13, 2023

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

但是

var result = _functions?['runtimeParseVar']?.call({name: ''});
这个地方返回的是 空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');
        }),
      ),
    );
  }
}

@ghy511024
Copy link
Contributor

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

@zmtzawqlp
Copy link
Contributor Author

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

@zmtzawqlp
Copy link
Contributor Author

zmtzawqlp commented May 4, 2023

@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

@yx-mike
Copy link

yx-mike commented May 19, 2023

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

@zmtzawqlp
Copy link
Contributor Author

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

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

@zmtzawqlp
Copy link
Contributor Author

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#")));

@yx-mike
Copy link

yx-mike commented May 19, 2023

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

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

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

@zmtzawqlp
Copy link
Contributor Author

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

@zmtzawqlp
Copy link
Contributor Author

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

@yx-mike
Copy link

yx-mike commented May 19, 2023

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

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

lib/src/render/expression.dart

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

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

@yx-mike
Copy link

yx-mike commented May 19, 2023

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

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

@zmtzawqlp
Copy link
Contributor Author

zmtzawqlp commented May 19, 2023

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

@yx-mike
Copy link

yx-mike commented May 19, 2023

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

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

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

@zmtzawqlp
Copy link
Contributor Author

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

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

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

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

@yx-mike
Copy link

yx-mike commented May 19, 2023

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

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants