在Dart中生成动态graphql查询的最佳方法是什么?

时间:2020-06-13 05:35:00

标签: flutter graphql

我在dart中编写了此方法以动态生成graphql查询,并且按预期方式工作:

String getPosts({
  bool id = false,
  bool title = false,
  bool description = false,
  bool date = false,
  bool creator = false,
}) {
  final fieldsStringList = [
    if (id) "_id",
    if (title) "title",
    if (description) "description",
    if (date) "date",
    if (creator) "creator{_id}",
  ];

  String fieldsString = "";

  for (var i = 0; i < fieldsStringList.length; i++) {
    fieldsString += fieldsStringList[i];
    if (i != fieldsStringList.length - 1) fieldsString += ',';
  }

  return 'query{posts{$fieldsString}}';
}

但是我想知道是否有更好的方法?

2 个答案:

答案 0 :(得分:0)

您可以使用StringBuffer代替String,并使用for each循环代替常规循环。

String getPosts({
  bool id = false,
  bool title = false,
  bool description = false,
  bool date = false,
  bool creator = false,
}) {
  final stringsList = <String>[
    if (id) '_id',
    if (title) 'title',
    if (description) 'description',
    if (date) 'date',
    if (creator) 'creator{_id}',
  ];

  final buffer = StringBuffer();

  for (var item in stringsList) {
    buffer.write(item);
    if (stringsList.last != item) buffer.write(',');
  }

  return 'query{posts{$buffer}}';
}

答案 1 :(得分:0)

对于其他情况相同的人,感谢@pskink,这是实现这一目标的一种更好的方法:

String getPosts({
  bool id = false,
  bool title = false,
  bool description = false,
  bool date = false,
  bool creator = false,
}) {
  final fields = [
    if (id) "_id",
    if (title) "title",
    if (description) "description",
    if (date) "date",
    if (creator) "creator{_id}",
  ];

  if (fields.isEmpty)
    throw EmptyQueryException('getPost() query must have at least 1 argument');

  return 'query{posts{${fields.join(',')}}}';
}