Flutter 颤振-使用FutureBuilder中的RefreshIndicator拉动刷新
编辑:。请查看Flutter 颤振-使用FutureBuilder中的RefreshIndicator拉动刷新,flutter,dart,networking,futuretask,Flutter,Dart,Networking,Futuretask,编辑:。请查看main.dart中的刷新方法 我正在使用FutureBuilder显示网络请求的结果。我在initstate中调用我的fetch方法(如建议的): } 如何在FutureBuilder中正确使用RefreshIndicator? Edit@Shri-Hari:引发此异常 class AppException implements Exception { final _message; final _prefix; AppException([this._message,
main.dart
中的刷新方法
我正在使用FutureBuilder
显示网络请求的结果。我在initstate
中调用我的fetch方法(如建议的):
}
如何在FutureBuilder
中正确使用RefreshIndicator
?
Edit@Shri-Hari:引发此异常
class AppException implements Exception {
final _message;
final _prefix;
AppException([this._message, this._prefix]);
String toString() {
return "$_prefix$_message";
}
}
class NotFoundException extends AppException {
NotFoundException([String message]) : super(message, "Data not found: ");
}
编辑@Mhark batocoy:是的,它是FutureBuilder
的一部分:
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: futureCheckIn,
builder: (context, snapshot) {
if (snapshot.hasData) {
List<CheckIn> checkIns = snapshot.data;
return buildResult(checkIns, context); // RefreshIndicator is nested in here
} else if (snapshot.hasError) {
// Error handling
...
}
// Spinner während der Datenabfrage
return Center(
child: CircularProgressIndicator(),
);
},
);
到
或
不会更改错误
_helper.fetchCheckIns(_eventArg.getEvent().id.toString());
它返回一个未来。您需要的数据
,或者错误
。您可以在try catch finally
块中使用async wait
,也可以使用Future.then()/Future.catchError/Future.whenComplete()
例如:
onRefresh: () async {
try {
//You can use the await keyword here.
return futureCheckIn =
await _helper.fetchCheckIns(_eventArg.getEvent().id.toString());
}catch (err){
//You can display the error here using a snackbar.
}finally {
//This executes whether there is an error or not.
}
},
它返回一个未来。您需要的数据
,或者错误
。您可以在try catch finally
块中使用async wait
,也可以使用Future.then()/Future.catchError/Future.whenComplete()
例如:
onRefresh: () async {
try {
//You can use the await keyword here.
return futureCheckIn =
await _helper.fetchCheckIns(_eventArg.getEvent().id.toString());
}catch (err){
//You can display the error here using a snackbar.
}finally {
//This executes whether there is an error or not.
}
},我不确定这是否是最好的答案,但我面临同样的问题,必须继续前进。所以,这就是我所学到和做的
RefreshIndicator
不喜欢异常。甚至在将它们移动到try/catch
或onError
下并成功使用异常之后,RefreshIndicator
仍在呼喊未处理的异常(有点奇怪,但我必须进一步调查)
我所做的是确保我的API调用不会引发任何异常。这意味着,API调用本身(在本例中为fetchCheckIns()
函数调用)捕获所有类型的已知/未知异常[catch(e)
],并在响应对象中设置一个从API返回的标志(在本例中为fetchCheckIns()
的返回类型对象)
现在,在您的FutureBuilder
中,当您调用buildResult(签入,上下文)
时,检查snapshot.data
并查找任何故障标志。如果失败,请以不同方式渲染屏幕。即:
if (snapshot.hasData) {
if (snapshot.data.error == true) {
return ...; // Render error message
} else {
return buildResult(snapshot.data, context);
}
}
这也意味着,您可能无法返回对象列表,并且可能必须将其包装到包含对象列表的单个对象中
也就是说,您的签入对象可能会被以下内容包装
class AllCheckIn {
List<CheckIn> checkIns;
bool error;
String errorMsg;
}
类所有签入{
列表签入;
布尔误差;
字符串errorMsg;
}
或者,您还可以根据在API调用中接收和捕获的异常添加更多错误消息描述,并在FutureBuilder
中使用
希望这有帮助。不确定这是否是最好的答案,但我也面临同样的问题,必须继续前进。所以,这就是我所学到和做的
RefreshIndicator
不喜欢异常。甚至在将它们移动到try/catch
或onError
下并成功使用异常之后,RefreshIndicator
仍在呼喊未处理的异常(有点奇怪,但我必须进一步调查)
我所做的是确保我的API调用不会引发任何异常。这意味着,API调用本身(在本例中为fetchCheckIns()
函数调用)捕获所有类型的已知/未知异常[catch(e)
],并在响应对象中设置一个从API返回的标志(在本例中为fetchCheckIns()
的返回类型对象)
现在,在您的FutureBuilder
中,当您调用buildResult(签入,上下文)
时,检查snapshot.data
并查找任何故障标志。如果失败,请以不同方式渲染屏幕。即:
if (snapshot.hasData) {
if (snapshot.data.error == true) {
return ...; // Render error message
} else {
return buildResult(snapshot.data, context);
}
}
这也意味着,您可能无法返回对象列表,并且可能必须将其包装到包含对象列表的单个对象中
也就是说,您的签入对象可能会被以下内容包装
class AllCheckIn {
List<CheckIn> checkIns;
bool error;
String errorMsg;
}
类所有签入{
列表签入;
布尔误差;
字符串errorMsg;
}
或者,您还可以根据在API调用中接收和捕获的异常添加更多错误消息描述,并在FutureBuilder
中使用
希望这有帮助。您能发布异常吗?您能发布异常吗?谢谢您的回复。我已经尝试过使用await
,但由于futureCheckIn
来自Future
类型,它不起作用,因为await\u helper.fetchCheckIns(_eventag.getEvent().id.toString())代码>来自类型列表
…您的刷新指示器是否在FutureBuilder中?如果是这样,请尝试在onRefresh()中返回_helper.fetchCheckIns()。是否可以尝试将futureCheckIn放入setState()中?不幸的是,异常仍然发生。。我将在第二天尝试写一个最小的可重复的例子。尝试将futureCheckIn=\u helper。。。。在try-catch区块内。感谢您的回复。我已经尝试过使用await
,但由于futureCheckIn
来自Future
类型,它不起作用,因为await\u helper.fetchCheckIns(_eventag.getEvent().id.toString())代码>来自类型列表
…您的刷新指示器是否在FutureBuilder中?如果是这样,请尝试在onRefresh()中返回_helper.fetchCheckIns()。是否可以尝试将futureCheckIn放入setState()中?不幸的是,异常仍然发生。。我将在第二天尝试写一个最小的可重复的例子。尝试将futureCheckIn=\u helper。。。。在try-catch块中。是的,我也这么认为,但找不到任何能够处理异常的示例。你的方法听起来很有趣。下次我需要刷新指示器时,我会使用它。我会给你反馈的。现在+1,谢谢你的回复@Virendra.Yeah I tho
if (snapshot.hasData) {
if (snapshot.data.error == true) {
return ...; // Render error message
} else {
return buildResult(snapshot.data, context);
}
}
class AllCheckIn {
List<CheckIn> checkIns;
bool error;
String errorMsg;
}