Flutter中关于使用异步时,获得Future<T;中数据的问题
Posted 浅唱封爵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter中关于使用异步时,获得Future<T;中数据的问题相关的知识,希望对你有一定的参考价值。
使用异步获得Future<T>
在flutter项目中使用async await异步获取数据时,会返回一个Future<T>类型的数据,然而将其使用在widget中,会有一个问题:在statefulWidget中使用变量接收值,会出现无法赋值的情况
///index.dart
class Index extends StatefulWidget {
Index({Key key}) : super(key: key);
@override
_IndexState createState() => _IndexState();
}
class _IndexState extends State<Index> {
List<Widget> _temps;
String _studentId = "abcd";
String _token =
"lkjncasfmalknfadwSadwawf1dawd";
@override
void initState() {
super.initState();
_temps = _getClassItems(getOneDaylessons(_dates, _studentId, _token));
}
var _dates = initDate();
void _getDates(value) {
_dates = DateFormat(\'EEE\', "en_US").format(value).toString();
setState(() {
_temps = _getClassItems(getOneDaylessons(_dates, _studentId, _token));
});
}
List<Widget> _getClassItems(List<Widget> classItems) {
if (classItems.isEmpty) {
return [
Container(
height: 60,
child: Center(
child: Text("今日暂无课程"),
),
)
];
} else {
return classItems;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child:
Column(
children: _temps,//报错处
),
)
)
}
///getOneDaylessons.dart
List<Widget> getOneDaylessons(String date, String studentId, String token) {
ClassResponseData _data;
getTimeTableFromStudentID(studentId, token)
.then((v) => {_data=v});
List<ClassItemViewModel> datas =
getADayClasses(data);
List temp = datas
.map((e) {
if (e.date == date) {
return ClassItem(data: e);
}
})
.toList()
.where((element) => element != null)
.toList();
return temp;
}
//运行项目报错_temps是null
解决方案
将getOneDaylessons同样使用async包装,返回Future<T>到index.dart.在index.dart中,使用FutureBuilder,取值
///getOneDaylessons.dart
Future<List<Widget>> getOneDaylessons(
String date, String studentId, String token) async {
ClassResponseData response =
await getTimeTableFromStudentID(studentId, token);
List<ClassItemViewModel> datas = getADayClasses(response);
List temp = datas
.map((e) {
if (e.date == date) {
return ClassItem(data: e);
}
})
.toList()
.where((element) => element != null)
.toList();
return temp;
}
///index.dart
...
_temps = _getClassItems();
...
Future<List<Widget>> _getClassItems() async {
List<Widget> classItems =
await getOneDaylessons(this._dates, this._studentId, this._token);
if (classItems.isEmpty) {
return [
Container(
height: 60,
child: Center(
child: Text("今日暂无课程"),
),
)
];
} else {
return classItems;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child:
Container(
child: FutureBuilder(
future: _temps,
builder:
// ignore: missing_return
(BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState ==
ConnectionState.done) {
if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Column(children: snapshot.data);
}
return CircularProgressIndicator();
}),
),
)
}
以上是关于Flutter中关于使用异步时,获得Future<T;中数据的问题的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Widgets 之 FutureBuilder