Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振-使用FutureBuilder中的RefreshIndicator拉动刷新_Flutter_Dart_Networking_Futuretask - Fatal编程技术网

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;
}