Flattern Wechseln Sie zur Registerkarte neu Geladen Widgets und läuft FutureBuilder
Das Problem:
Habe ich 2 Registerkarten mit Standard-Registerkarten-Controller, etwa so:
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
drawer: Menu(),
appBar: AppBar(
title: Container(
child: Text('Dashboard'),
),
bottom: TabBar(
tabs: <Widget>[
Container(
padding: EdgeInsets.all(8.0),
child: Text('Deals'),
),
Container(
padding: EdgeInsets.all(8.0),
child: Text('Viewer'),
),
],
),
),
body: TabBarView(
children: <Widget>[
DealList(),
ViewersPage(),
],
),
),
);
}
}
Den DealList()
ist ein StatefulWidget
was ist so gebaut:
Widget build(BuildContext context) {
return FutureBuilder(
future: this.loadDeals(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
print('Has error: ${snapshot.hasError}');
print('Has data: ${snapshot.hasData}');
print('Snapshot data: ${snapshot.data}');
return snapshot.connectionState == ConnectionState.done
? RefreshIndicator(
onRefresh: showSomething,
child: ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
itemCount: snapshot.data['deals'].length,
itemBuilder: (context, index) {
final Map deal = snapshot.data['deals'][index];
print('A Deal: ${deal}');
return _getDealItem(deal, context);
},
),
)
: Center(
child: CircularProgressIndicator(),
);
},
);
}
}
Mit den oben genannten, hier ist, was passiert, wenn ich wechseln Sie zurück zu den DealList()
Registerkarte: Es lädt.
Gibt es eine Möglichkeit zu verhindern, re-run der FutureBuilder, wenn einmal getan? (der plan ist für Benutzer, die in der RefreshIndicator neu zu laden. So ändern tabs sollte nicht lösen nichts, es sei denn, explizit getan durch den Benutzer.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es hier zwei Probleme, das erste:
Wenn die
TabController
schaltet, tabs, entlädt es die alte widget-Baum Speicher zu speichern. Wenn Sie dieses Verhalten ändern möchten, müssen Sie mixinAutomaticKeepAliveClientMixin
Ihrem tab-widget ist-Zustand.Das zweite Problem ist, bei Ihrer Nutzung der
FutureBuilder
-Wenn Sie eine neue
Future
zu einemFutureBuilder
es nicht sagen können, dass die Ergebnisse wären die gleichen wie beim letzten mal, so hat es neu zu erstellen. (Denken Sie daran, dass Flattern können rufen Sie Ihren build-Methode bis zu einmal pro frame).Statt, die Sie zuweisen möchten, in der Zukunft zu einem Mitglied auf die State-Klasse in initState, und dann diesen Wert übergeben, um die
FutureBuilder
. Das sorgt dafür, dass die Zukunft sind die gleichen, die auf spätere Umbauten. Wenn Sie erzwingen möchten, dass der Staat, um neu zu laden Sie die Angebote, können Sie immer erstellen Sie eine Methode, die eine Neuzuordnung der_loadingDeals
Mitglied und fordertsetState
.AsyncMemoizer::runOnce()
medium.com/saugo360/...bottomNavigationBar
, aber wenn ich die Seite wechseln, ist es immer noch feuert die API.