Как получить обновление FutureBuilder <List <Data>> (); страница трепещет?
здесь я пытаюсь использовать FutureBuilder для своего списка, но я не могу обновить его на pullRefresh
FutureBuilder<List<Data>?>(
future: getMultipleStoreData(UIdRequest(uId: widget.userId).toJson()),
builder: (context, AsyncSnapshot<List<Data>?> snapshot) {
if (snapshot.hasData) { } } );
2 ответа
Если вы ищете тянуть, чтобы обновить. Оберните свои виджеты виджетом «RefreshIndicator» на нужный экран.
Вот пример моего домашнего экрана, который требует обновления.
@override
Widget build(BuildContext context) {
return Scaffold(
key: _con.scafoldKey,
body: WillPopScope(
onWillPop:() => DeviceUtils.instance.onWillPop(),
child: SafeArea(
child: Container(
color: ColorUtils.themeColor,
child: RefreshIndicator( //Just add this to your screen
color: ColorUtils.themeColor,
key: _con.refreshIndicatorKey,
strokeWidth: 4,
displacement: 80,
onRefresh: _refresh, //this is a function which you need to place under your home view state
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
child: Container(
color: Colors.white,
child: /// some more widgets
),
),
),
),
);
}
После добавления индикатора обновления к вашим виджетам вам нужно добавить функцию _refresh, которая будет иметь все ваши API, которые вы хотите перезагрузить.
Future<Null> _refresh() async{
//these two are my api's that i want to reload everytime an user pulls to refresh screen. You have to add your own apis here.
_con.getProfile(context);
_con.getUpcoming(context);
}
Вуаля. Теперь ваш пользователь может перезагрузить данные на странице и получить новое состояние. Надеюсь, что это ответ на ваш вопрос.
Если вышеперечисленное не то, что вы хотите. Вы можете использовать setState() внутри вашего будущего конструктора. См. код ниже, например:
class _MyHomePageState extends State<MyHomePage> {
Future<List<String>> _myData = _getData(); //<== (1) here is your Future
@override
Widget build(BuildContext context) {
var futureBuilder = new FutureBuilder(
future: _myData; //<== (2) here you provide the variable (as a future)
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return new Text('loading...');
default:
if (snapshot.hasError)
return Column(
children: [
Icon(Icons.error),
Text('Failed to fetch data.'),
RaisedButton(
child: Text('RETRY'),
onPressed: (){
setState(){
_myData = _getData(); //<== (3) that will trigger the UI to rebuild an run the Future again
}
},
),
],
);
else
return createListView(context, snapshot);
}
},
);
return new Scaffold(
appBar: new AppBar(
title: new Text("Home Page"),
),
body: futureBuilder,
);
}
setState() перестроит виджет с новыми значениями.
вы можете просто использовать на главном экране setState((){}); он перестроит все виджеты futureBuilder на вашем экране и получит новые данные