Не работает ли AutomaticKeepAliveClientMixin с BottomNavigationBar?

У меня есть ListView который принимает элементы из асинхронного http-вызова get. Я устанавливаю элементы списка в initState, а затем хочу только перезагрузить их, используя RefreshIndicator.onRefresh() но так как AutomaticKeepAliveClientMixin не работает каждый раз, когда я меняю виджеты, он вызывает initState виджета. Есть что-то, чего мне не хватает или это только для работы? TabView

class Home extends StatefulWidget {
    @override
    State<StatefulWidget> createState() {
    return _HomeState();
    }
}

class _HomeState extends State<Home> {
    final Key keyNews = PageStorageKey('newsHome');

    int _selectedIndex;
    Widget selectedPage;

    NewsHome newsHome;
    TeamHome teamHome;
    StarsHome starsHome;

    List<Widget> _widgetOptions;

    @override
    Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            title: Image(image: AssetImage('assets/images/logo.png')),
            centerTitle: true,
        ),
        body: Container(
            decoration: BoxDecoration(
                image: DecorationImage(
                    image: AssetImage('assets/images/fundo_conteudos.png'),
                    fit: BoxFit.cover)),
            child: Column(children: [
            Expanded(
                child: selectedPage)
            ])),
        bottomNavigationBar: BottomNavigationBar(
            type: BottomNavigationBarType.fixed,
            fixedColor: Colors.orange[900],
            items: [
            BottomNavigationBarItem(
                title: Text('HOME'), icon: Icon(Icons.home)),
            BottomNavigationBarItem(
                title: Text('EQUIPA'),
                icon: ImageIcon(
                    AssetImage('assets/images/bottom/equipa.png'),
                )),
            BottomNavigationBarItem(
                title: Text('ESTRELAS'),
                icon: ImageIcon(
                    AssetImage('assets/images/bottom/estrelas.png'),
                ))
            ],
            currentIndex: _selectedIndex,
            onTap: _onItemTapped,
        ));
    }

    void _onItemTapped(int index) {
    setState(() {
        _selectedIndex = index;
        selectedPage = _widgetOptions[index];
    });
    }

    @override
    void initState() {
    super.initState();

    starsHome = StarsHome();
    teamHome = TeamHome();
    newsHome = NewsHome(key: keyNews);

    _selectedIndex = 0;
    selectedPage = newsHome;

    _widgetOptions = [newsHome, teamHome, starsHome];
    }
}

class NewsHome extends StatefulWidget {

    List news;

    NewsHome({Key key, this.news}) : super(key: key);

    @override
    State<StatefulWidget> createState() {
    return _NewsHomeState();
    }
}

Future<List> fetchNews(int number) async {
    List _news = new List();

    final response =
    await http.get('http://someapiwebsite/api/news');

    dynamic jsondecode = json.decode(response.body);

    for(int i = 0; i < number; i++){
    if(jsondecode[i] != null){
        _news.add(News.fromJson(jsondecode[i]));
    }
    }
    /*for (var news in jsondecode) {
    _news.add(new News.fromJson(news));
    }*/
    print('ran fetchNews');

    return _news;
}

class _NewsHomeState extends State<NewsHome> with AutomaticKeepAliveClientMixin<NewsHome>{
    List _news = new List();

    @override
    Widget build(BuildContext context) {
    super.build(context);
    return Container(
        child: RefreshIndicator(child: ListView.builder(
                physics: const AlwaysScrollableScrollPhysics(),
                padding: EdgeInsets.all(0),
                itemBuilder: (context, index) {
                    return NewsListItem(news:_news[index]);
                },
                itemCount: _news.length,

                ), onRefresh: () {
                return fetchNews(3).then((value) {
                    setState(() {
                    _news = value;
                    });
                });
    }));
    }

    @override
    void initState() {
    super.initState();
    fetchNews(2).then((value){
        setState(() {
        _news = value;
        });
    });
    }

    @override
    bool get wantKeepAlive => true;
}

Есть ли другой способ заполнить ListView, который я не знаю?

0 ответов

Другие вопросы по тегам