我正在创建一个语言应用程序,我将所有的课程材料存储在csv的资产文件夹中。我试图获得颤振加载数据从CSV单元到应用程序,但颤振只是返回一个未来的实例,而不是存储在CSV中的值
在下面的代码中,getData() async{}方法在flutter运行打印行(await data[1][1])时打印存储在单元格[1][1]的正确值;但是return下面的return行等待数据[1][1];只返回Future<dynamic>'的实例而不是值。
总之,它打印csv值,但不返回csv值。
我怎么能让它做我想做的事呢?
从本地存储加载csv数据是否需要异步?
有没有更好的方法加载数据到颤振使用CSV?(我用Python构建了这个应用程序,这是非常容易完成的,但我不得不切换到颤振)
import 'package:csv/csv.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
// ignore: must_be_immutable
class ClassContent extends StatelessWidget {
ClassContent();
List<List<dynamic>> data = [];
loadAsset() async {
final myData = await rootBundle.loadString("assets/class01.csv");
List<List<dynamic>> csvTable = CsvToListConverter().convert(myData);
data = csvTable;
}
getData() async {
await loadAsset();
print(await data[1][1]); // PRINTS THE CORRECT VALUE STORED IN THE CSV
return await data[1][1]; // DOES NOT RETURN THE VALUE
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Phonica"), elevation: 0),
body: ListView(children: [
for (var i = 0; i < 5; i++) ListTile(title: Text(getData().toString()))
]),
);
}
}
### Dart的默认返回类型是void。你的异步函数需要返回一个Future类型。例如,因为data
is a List<List<dynamic>>
you're returning "dynamic" in getData():
List<List<dynamic>>
you'r你在getData()中返回"dynamic":
Future<dynamic> getData() async {
await loadAsset(); //should return Future<void>
print(data[1][1]); //no await here because List lookup isn't async
return data[1][1]; //no await here either
}