我的 Jmeter 板代码看起来像这样,这里我在getReport方法中执行get req,我已经在代码中添加了RefreshIndicator
,当在容器中下拉时,它应该执行刷新,这里我调用了我的getData(),但是我没有获得刷新的内容,我在下面添加了我的代码,让我知道我是否犯了错误。
在我 Jmeter 盘下面
class Window extends StatefulWidget {
@override
_WindowState createState() => _WindowState();
}
class _WindowState extends State<Window> {
Future reportList;
@override
void initState() {
super.initState();
reportList = getReport();
}
Future<void> getReport() async {
http.Response response =
await http.get(reportsListURL, headers: {"token": "$token"});
switch (response.statusCode) {
case 200:
String reportList = response.body;
var collection = json.decode(reportList);
return collection;
case 403:
break;
case 401:
return null;
default:
return 1;
}
}
getRefreshScaffold() {
return Center(
child: RaisedButton(
onPressed: () {
setState(() {
reportList = getReport();
});
},
child: Text('Refresh, Network issues.'),
),
);
}
getDashBody(var data) {
double maxHeight = MediaQuery.of(context).size.height;
return Column(
children: <Widget>[
Container(
height: maxHeight - 800,
),
Container(
margin: new EdgeInsets.all(0.0),
height: maxHeight - 188,
child: new Center(
child: new RefreshIndicator( //here I am adding the RefreshIndicator
onRefresh:getReport, //and calling the getReport() which hits the get api
child: createList(context, data),
),),
),
],
);
}
Widget createList(BuildContext context, var data) {
Widget _listView = ListView.builder(
itemCount: data.length,
itemBuilder: (context, count) {
return createData(context, count, data);
},
);
return _listView;
}
createData(BuildContext context, int count, var data) {
var metrics = data["statistic_cards"].map<Widget>((cardInfo) {
var cardColor = getColorFromHexString(cardInfo["color"]);
if (cardInfo["progress_bar"] != null && cardInfo["progress_bar"]) {
return buildRadialProgressBar(
context: context,
progressPercent: cardInfo["percentage"],
color: cardColor,
count: cardInfo["value"],
title: cardInfo["title"],
);
} else {
return buildSubscriberTile(context, cardInfo, cardColor);
}
}).toList();
var rowMetrics = new List<Widget>();
for (int i = 0; i < metrics.length; i += 2) {
if (i + 2 < metrics.length)
rowMetrics.add(Row(children: metrics.sublist(i, i + 2)));
else
rowMetrics.add(Row(children: [metrics[metrics.length - 1], Spacer()]));
}
return SingleChildScrollView(
child: LimitedBox(
// maxHeight: MediaQuery.of(context).size.height / 1.30,
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: rowMetrics,
),
),
);
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: reportList,
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
case ConnectionState.active:
return Center(
child: CircularProgressIndicator(),
);
case ConnectionState.done:
var data = snapshot.data;
if (snapshot.hasData && !snapshot.hasError) {
return getDashBody(data);
} else if (data == null) {
return Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text("Timeout! Log back in to continue"),
Padding(
padding: EdgeInsets.all(25.0),
),
RaisedButton(
onPressed: () {
setState(() {
token = null;
});
Navigator.of(context).pushReplacement(
CupertinoPageRoute(
builder: (BuildContext context) => LoginPage()),
);
},
child: Text('Login Again!'),
),
],
),
);
} else {
getRefreshScaffold();
}
}
},
);
}
}
5条答案
按热度按时间cnh2zyt31#
基本示例
下面是StatefulWidget的State类,其中:
ListView
被 Package 在RefreshIndicator
中numbersList
状态变量是其数据源onRefresh
调用_pullRefresh
函数以更新数据和ListView_pullRefresh
是异步函数,不返回任何内容(Future<void>
)_pullRefresh
的长时间运行的数据请求完成时,在setState()
调用中更新numbersList
成员/状态变量,以重建ListView
,从而显示新数据,备注
onRefresh
函数很快就完成了,您可能希望在它后面添加一个await Future.delayed(Duration(seconds: 2));
,这样用户体验会更好。FutureBuilder范例
下面是使用FutureBuilder的上述
State<PullRefreshPage>
类的另一个版本,这在从数据库或HTTP源获取数据时很常见:备注
slowNumbers()
函数与上述基本示例中的函数相同,但数据被 Package 在Future.value()
中,因为FutureBuilder
需要Future
,但setState()
* 不 * 应等待异步数据setState()
(FutureBuilder示例中为futureNumbersList
,Basic示例中为numbersList
)内更新Stateful Widget成员变量是一个很好的做法。async
,则会出现异常setState
之外的成员变量并具有空的setState
闭包,可能会在将来导致握手/代码分析警告irlmq6kh2#
不确定未来,但对于刷新指标,您必须返回一个void,因此使用类似于
试试这个,让我知道!
编辑:
好吧,那就试试这个在你里面刷新的方法吧
zd287kbt3#
试试这个:
而不是
onRefresh:getReport
reportList
字段是Future
,它只返回一次值。因此,当您再次调用getReport
时,它不会发生任何变化。实际上,更正确的做法是使用Stream
和StreamBuilder
,而不是Future
和FutureBuilder
。但对于此代码,这可能是最短的解决方案。djmepvbi4#
简易法:您可以只使用“下拉”来刷新包-https://pub.dev/packages/pull_to_refresh
trnvg8h35#
在不可滚动列表视图中,RefreshIndicator不起作用,因此您必须使用Stack Package 小部件,以实现下拉刷新。