Flutter: FutureBuilder срабатывает на другом view
Есть view A и view B.
На А есть FutureBuilder.
Когда переходу из view А на view B через Navigator.Push() срабатывает функция которая прикреплена к FutureBuilder на view A.
Мне не нужно чтобы срабатывал FutureBuilder если я не на view с Futurebuilder
Это код "view A"(_StoriesState), когда я перехожу на B(StoryPage) вызывается функция getStories которую можно вызвать только в A(_StoriesState)
............
Future<dynamic> getStories(int items, List<int> pickerSelectedIndex) async {
try {
............
return stories;
} on HandshakeException catch (e) {
print("HE: " + e.toString());
getStories(items, pickerSelectedIndex);
} on SocketException catch (e) {
print("SE: " + e.toString());
getStories(items, pickerSelectedIndex);
} on Exception catch (e) {
print(e);
getStories(items, pickerSelectedIndex);
}
}
............
class _StoriesState extends State<Stories> {
Future<List<Story>> listViewData;
............
Future<List<Story>> getStoriesDataReady(
int items, List<int> pickerSelectedIndex) async {
List<Story> stories = await getStories(items, pickerSelectedIndex);
if (globals.filter.isEmpty) {
return stories;
} else {
............
return searchStories;
}
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: ............
builder: (BuildContext context, AsyncSnapshot snapshot) {
List<Widget> children;
if (snapshot.hasData) {
listViewData =
getStoriesDataReady(globals.items, pickerSelectedIndex);
return Scaffold(
body: FutureBuilder<List<Story>>(
future: listViewData,
builder: (BuildContext context,
AsyncSnapshot<List<Story>> snapshot) {
if (snapshot.hasData) {
............
child: FloatingSearchBar.builder(
............
itemCount: snapshot.data.length + 1,
itemBuilder:
(BuildContext context, int index) {
............
onTap: () {
............
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => StoryPage(............)),
).then((value) {
FocusScope.of(context).requestFocus(FocusNode());
});
}
............
}),
............
});
}
}
Подскажите, как я могу это реализовать?
Ответы (1 шт):
1) Перенесите инициализацию listViewData в initState для того чтобы, инициализировать её единожды при создании виджета:
@override
void initState() {
super.initState();
listViewData = getStoriesDataReady(globals.items, pickerSelectedIndex);
}
2) У вас нет проблем с snapshot (имена одинаковые...)?
Ответ дан исходя из предоставленного кода и информации. Возможно это не решит проблему, так как она может находиться где-то в другом месте...