如何将 Future<dynamic> 转换为 dart:flutter 中的字符串

Posted

技术标签:

【中文标题】如何将 Future<dynamic> 转换为 dart:flutter 中的字符串【英文标题】:how to transform a Future<dynamic> to string in dart:flutter 【发布时间】:2020-02-25 10:28:15 【问题描述】:

我正在使用一些 sqflite 对数据库进行查询,并提取表的特定名称,例如:我有 3 个名称,罗伯托、里卡多和安德烈斯,我只想获取罗伯托的名称,所以这就是我正在做的事情:

loginLogic() async 
  var X = 'Roberto';
  final db = await database;
  List<Map> result = await db.rawQuery('SELECT * FROM Usuario WHERE username=?', [X]);

所以现在,我想将这个结果与另一个结果进行比较来做一个“if”函数,就像这样:

if(result==X)
  return 1;
 else 
  return 0;

但这就是flutter所说的:

List<Map<dynamic, dynamic>> result
Equality operator '==' invocation with references of unrelated

还有调试控制台:

type 'Future<dynamic>' is not a subtype of type 'int'

所以我需要一种方法来比较来自用户列表的值与带有我声明为“X”的变量的字符串。

尝试使用this problem的引用

这是我尝试过的:

loginLogicpar() async 
  var X = 'Giova';
  final db = await database;
  final result = await db.rawQuery('SELECT * FROM Usuario WHERE username=?', [X]);
  return result;


loginLogic() async 
  var X = 'Giova';
  final user = await loginLogicpar();
  if(user==X)
    return 1;
  
  return 0;

并返回完全相同的结果:类型'Future'不是类型'int'的子类型

添加了the code,以便您可以复制它,只要确保您的依赖项上有 sqflite。

【问题讨论】:

这能回答你的问题吗? Flutter how to use Future return value as if variable 不,我试过了,没啥影响,把修改后的代码贴在帖子上 您能告诉我们db.rawQuery('SELECT * FROM Usuario WHERE username=?', [X]); 调用实际返回的内容是什么吗? 这是我得到的: _columnIndexMap:Map (4 items) _columns:CastList _keys:List (4 items) _rows:CastList first:QueryRow hashCode:218916665 isEmpty:false isNotEmpty:true iterator:ListIterator keys :List (4 items) last:QueryRow length:1 reversed:ReversedListIterable runtimeType:Type (QueryResultSet) single:QueryRow @mutantkeyboard 是的!这为我解决了!现在我从桌子上得到了我想要的名字,你让我很开心,先生!我发布了我的代码,所以你知道我是怎么做到的。 【参考方案1】:

这是一条地狱般的道路,但我在你们所有人的帮助下成功了,但最后一块是@mutantkeyboard,我得到的是 Sqflite 表中不同元素的列表,但在转换后它带有一个变量和 .first 函数,我可以将它转换为另一个变量!这是我做的:

loginLogic() async 
  final db = await database;
  var table = await db.rawQuery("SELECT MAX(id)+1 as id FROM Usuario");
  int id = table.last["id"];
  for(var i=1; i<id; i++)
    var result = await db.rawQuery('SELECT username FROM Usuario WHERE id=?', [i]);
    String Y = result.first["username"];
    if(Y=='Roberto')
      return 1;
    
  
  return 0;

如果您想将其与外部的另一个变量进行比较,例如本地登录的身份验证(这就是我所做的,只是为了教育目的,我绝不建议您将用户名和密码放入您的本地软件)并将 textfield.text 与表格进行比较,然后您可以将代码修改为如下内容:

loginLogic(String field) async 
  final db = await database;
  var table = await db.rawQuery("SELECT MAX(id)+1 as id FROM Usuario");
  int id = table.last["id"];
  for(var i=1; i<id; i++)
    var result = await db.rawQuery('SELECT username FROM Usuario WHERE id=?', [i]);
    String Y = result.first["username"];
    if(Y==field)
      return 1;
    
  
  return 0;

【讨论】:

以上是关于如何将 Future<dynamic> 转换为 dart:flutter 中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 Future<dynamic> 不是 Flutter 中类型的子类型

参数类型“User”不能分配给参数类型“Future<dynamic>”。? [复制]

Flutter:类型 'Future<dynamic>' 不是类型 'Future<Document>' 的子类型

颤振:类型“Future<dynamic>”不是“Widget”类型的子类型?错误

Flutter:类型 'Future<dynamic>' 不是类型 'Widget' 的子类型 // MaterialPageRoute<dynamic>(null))

类型 'Future<dynamic>' 不是 Flutter 数据库创建中的“Future<int>”类型异常的子类型