flutter - 将 API 中的数据设置为变量 - Flutter
问题描述
所以我目前正在从模拟 api 获取一组数据,我试图将这些数据放入我创建的对象中,然后将其呈现在屏幕上。目前我已经从 API 获取数据,但是当我尝试将数据放入变量并打印结果时,它不起作用,但是当我在函数内部打印数据时它确实起作用调用数据(如下所示)。它还在页面的初始化(或状态,我不确定)上调用 Future 函数 (getUserFeed) - 这是当前代码:
class SocialPage extends StatefulWidget {
final String argument;
const SocialPage({Key key, this.argument}) : super(key: key);
@override
_SocialPageState createState() => _SocialPageState(argument);
}
Future getUserFeed() async {
final response = await http.get(
'https://cartalkio-mock-api.s3.eu-west-2.amazonaws.com/textfeed.json');
print(response.statusCode);
if (response.statusCode == 200) {
print(json.decode(response.body));
return json.decode(response.body);
} else {
throw Exception('Failed to load album');
}
}
class _SocialPageState extends State<SocialPage> {
String argument;
_SocialPageState(this.argument);
Future feedData;
setFeedData() {
setState(() {
feedData = getUserFeed();
});
}
checkFeedData() {
print(feedData);
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: (FloatingActionButton(onPressed: () async {
Navigator.pushNamed(context, SectionSelectRoute, arguments: argument);
})),
body: SafeArea(
child: Column(
children: <Widget>[
FlatButton(
onPressed: setFeedData,
child: (Text('Set data')),
),
FlatButton(
onPressed: checkFeedData,
child: (Text('Check data')),
),
],
),
),
);
}
}
这是我调用“checkFeedData”函数时返回的内容:
Instance of 'Future<dynamic>'
[编辑]
根据 P4yam 提供的答案,将其更改为:
Future<Map<String,dynamic>> getUserFeed() async {
final response = await http.get(
'https://cartalkio-mock-api.s3.eu-west-2.amazonaws.com/textfeed.json');
if (response.statusCode == 200) {
print(json.decode(response.body));
return json.decode(response.body);
} else {
throw Exception('Failed to load album');
}
}
class _SocialPageState extends State<SocialPage> {
String argument;
_SocialPageState(this.argument);
Map<String,dynamic> feedData;
setFeedData() async{
feedData = await getUserFeed();
}
checkFeedData() {
print(feedData);
}
调用函数的按钮
FlatButton(
onPressed: setFeedData,
child: (Text('Set data')),
),
FlatButton(
onPressed: checkFeedData,
child: (Text('Check data')),
),
getUserFeed 函数打印来自 API 的实际数据,但是当我调用 checkFeedData 函数时,它打印 null。
[编辑 2]
功能
setFeedData() async{
feedData = await getUserFeed();
print('-----------'); // It's not running this print function
print(feedData); // Dont think its running this function
}
安慰
I/flutter ( 6245): 200
I/flutter ( 6245): [{id: 2, photoUrl: https://cartalkio-image-storage-dev.s3.eu-west-2.amazonaws.com/o85DvOaTXXE.jpg, description: Magna duis consectetur sit ut commodo non eiusmod., dateAdded: 0001-01-01T00:00:00, isMain: false, publicId: null, isImage: true, mainImage: https://randomuser.me/api/portraits/men/76.jpg, userId: 9, likers: null, username: Larsen, thumbnail: null, likes: 0}, {id: 4, photoUrl: https://cartalkio-image-storage-dev.s3.eu-west-2.amazonaws.com/lXR833PRh3g.jpg, description: Magna duis consectetur sit ut commodo non eiusmod., dateAdded: 0001-01-01T00:00:00, isMain: false, publicId: null, isImage: true, mainImage: https://randomuser.me/api/portraits/men/4.jpg, userId: 8, likers: null, username: Lloyd, thumbnail: null, likes: 0}, {id: 6, photoUrl: https://cartalkio-image-storage-dev.s3.eu-west-2.amazonaws.com/geTFl8b0m9M.jpg, description: Magna duis consectetur sit ut commodo non eiusmod., dateAdded: 0001-01-01T00:00:00, isMain: false, publicId: null, isImage: true, mainImage: https://randomuser.me/api/port
E/flutter ( 6245): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'FutureOr<Map<String, dynamic>>'
E/flutter ( 6245): #0 getUserFeed (package:TCS/social.dart:29:5)
E/flutter ( 6245): <asynchronous suspension>
E/flutter ( 6245): #1 _SocialPageState.setFeedData (package:TCS/social.dart:48:22)
E/flutter ( 6245): #2 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:779:19)
E/flutter ( 6245): #3 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:862:36)
E/flutter ( 6245): #4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter ( 6245): #5 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:504:11)
E/flutter ( 6245): #6 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:282:5)
E/flutter ( 6245): #7 BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:217:7)
E/flutter ( 6245): #8 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:475:9)
E/flutter ( 6245): #9 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:76:12)
E/flutter ( 6245): #10 PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:122:9)
E/flutter ( 6245): #11 _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:379:8)
E/flutter ( 6245): #12 PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:120:18)
E/flutter ( 6245): #13 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:106:7)
E/flutter ( 6245): #14 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:218:19)
E/flutter ( 6245): #15 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter ( 6245): #16 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter ( 6245): #17 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter ( 6245): #18 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter ( 6245): #19 _rootRunUnary (dart:async/zone.dart:1196:13)
E/flutter ( 6245): #20 _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 6245): #21 _CustomZone.runUnaryGuarded (dart:async/zone.dart:987:7)
E/flutter ( 6245): #22 _invoke1 (dart:ui/hooks.dart:275:10)
E/flutter ( 6245): #23 _dispatchPointerDataPacket (dart:ui/hooks.dart:184:5)
E/flutter ( 6245):
解决方案
首先更改feedData
为:
List<dynamic> feedData;
然后更改Future getUserFeed()
为:
Future<List<dynamic>> getUserFeed(){
...
并更改setFeedData
为:
setFeedData() async{
feedData = await getUserFeed();
}
推荐阅读
- php - 当我向 localhost 提交信息时,出现 PHP 代码
- laravel - Laravel:网站内未定义的变量帖子
- javascript - 重新渲染后视频 onEnd 触发两次
- php - 使用 mysqli_num_rows() 时没有回显
- react-native - 在 React Native 中上传视频时出错
- matlab - 如何在 MATLAB 中更改直线的角度?
- react-admin - 在 show/edit-URL 中使用 ID 而不是 IRI
- oracle - ORACLE PL/SQL 更新价格
- python - 有没有一种优雅的方法可以在没有 x 的情况下增加“arr”的索引?
- r - R编程:子集函数列标题以其原始格式不可用