无法在 Flutter 的文本小部件中显示数据库中的文本
Unable to display text from database in a text widget in Flutter
几个月来一直在用 dart 编写代码。当前正在尝试生成包含来自本地 SQL 数据库的标题的网格视图。我能够浏览数据库并将标题保存到数组中供以后使用。我可以毫无问题地将它们打印出来,但是当我尝试在我的网格视图中显示它们时,我得到“type 'Future' is not a subtype of type 'String'”奇怪的是我的代码适用于其次并正确显示信息,但是当我刷新页面(我没有触摸代码)时,我得到了最让我困惑的错误。
数据库助手class
getFactTitle(String target, int position) async {
Database db = await this.database;
String searchString =
('SELECT title FROM factTable WHERE fid="' + target + '"');
var result = await db.rawQuery(searchString);
if (result.length > 0) {
titles[position] = result.first.values.first.toString();
} else {
return null;
}
}
网格视图
Widget _buttons() {
return Expanded(
child: GridView.count(
crossAxisCount: 2, //NUMBER OF COLUMNS
children: List.generate(numberOfFacts, (index) {
return Center(
child: new Column(children: <Widget>[
IconButton(
icon: Image.asset('assets/pictures/' +
category +
_stringIndex(index) +
'a.jpg'),
onPressed: () {
print("Clicked: " + category + _stringIndex(index));
}),
Text(
_getTitle(index),
),
]),
);
}),
),
);
}
_getTitle(int index) async {
print(titles[index]);
return titles[index];
}
_getTitles() async {
String theTitle;
_getCategory();
for (int i = 1; i <= numberOfFacts; i++) {
String target = category + (i.toString());
await helper.getFactTitle(target, i);
print(titles[i]);
theTitle = titles[i];
}
return theTitle;
}
_getTitle(int index)
不应该是 async
.
由于 _getTitle(int index)
是 async
,您必须等待它完成。
在这种情况下,您可以使用 FutureBuilder
.
FutureBuilder<String>(
future: _getTitle(index),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data);
}
}
);
您还可以处理错误和等待状态。
更多信息:https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
几个月来一直在用 dart 编写代码。当前正在尝试生成包含来自本地 SQL 数据库的标题的网格视图。我能够浏览数据库并将标题保存到数组中供以后使用。我可以毫无问题地将它们打印出来,但是当我尝试在我的网格视图中显示它们时,我得到“type 'Future' is not a subtype of type 'String'”奇怪的是我的代码适用于其次并正确显示信息,但是当我刷新页面(我没有触摸代码)时,我得到了最让我困惑的错误。
数据库助手class
getFactTitle(String target, int position) async {
Database db = await this.database;
String searchString =
('SELECT title FROM factTable WHERE fid="' + target + '"');
var result = await db.rawQuery(searchString);
if (result.length > 0) {
titles[position] = result.first.values.first.toString();
} else {
return null;
}
}
网格视图
Widget _buttons() {
return Expanded(
child: GridView.count(
crossAxisCount: 2, //NUMBER OF COLUMNS
children: List.generate(numberOfFacts, (index) {
return Center(
child: new Column(children: <Widget>[
IconButton(
icon: Image.asset('assets/pictures/' +
category +
_stringIndex(index) +
'a.jpg'),
onPressed: () {
print("Clicked: " + category + _stringIndex(index));
}),
Text(
_getTitle(index),
),
]),
);
}),
),
);
}
_getTitle(int index) async {
print(titles[index]);
return titles[index];
}
_getTitles() async {
String theTitle;
_getCategory();
for (int i = 1; i <= numberOfFacts; i++) {
String target = category + (i.toString());
await helper.getFactTitle(target, i);
print(titles[i]);
theTitle = titles[i];
}
return theTitle;
}
_getTitle(int index)
不应该是 async
.
由于 _getTitle(int index)
是 async
,您必须等待它完成。
在这种情况下,您可以使用 FutureBuilder
.
FutureBuilder<String>(
future: _getTitle(index),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data);
}
}
);
您还可以处理错误和等待状态。
更多信息:https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html