Как получить обновление 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 на вашем экране и получит новые данные

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