Как использовать оба метода FutureBuilder и setState?(Flutter)

#flutter

#flutter

Вопрос:

Я попытался загрузить данные из базы данных с помощью FutureBuilder, подобного этому коду.

 // counter application

import 'package:flutter/material.dart';

class SetStateScreen extends StatefulWidget {
  @override
  _SetStateScreenState createState() => _SetStateScreenState();
}

class _SetStateScreenState extends State<SetStateScreen> {
  Future<int> getData() async {
    int initNumFromDB = 0; // fetch some asynchronous initial value
    return initNumFromDB;
  }

  @override
  Widget build(BuildContext context) {
    int counter;
    return Container(
      color: Colors.white,
      child: FutureBuilder(
          future: getData(),
          builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
            Widget childWidget;
            if (snapshot.hasData) {
              counter = snapshot.data; 
              childWidget = Center(
                child: Container(
                    child: FlatButton(
                  onPressed: () {
                    setState(() {
                      counter  = 1;
                    });
                  },
                  child: Text("$counter"),
                )),
              );
            } else {
              childWidget = Container();
            }
            return childWidget;
          }),
    );
  }
}
  

Но при нажатии кнопки и запуске метода setState FutureBuilder снова загружает исходные данные и сбрасывает номер счетчика. Как загрузить исходные данные один раз и правильно запустить этот код?

Комментарии:

1. initState() { getData(); } вам нужно вызвать getData из initState

2. Я думаю, что метод async в методе initState не подходит, потому что он запускает метод сборки до завершения асинхронного метода.

3. Верно, но после завершения асинхронности вы можете использовать set state, и в этом случае он будет вызван только один раз

4. Хорошо, я понял. Спасибо, Кумбхани:)

5. ЭТО решит вашу проблему или нет?

Ответ №1:

Попробуйте, это правильный способ использования

 class SetStateScreen extends StatefulWidget {
  @override
  _SetStateScreenState createState() => _SetStateScreenState();
}

class _SetStateScreenState extends State<SetStateScreen> {
    Future<int> getData() async {
        int initNumFromDB = 0; // fetch some asynchronous initial value
        return initNumFromDB;
    }

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

Ответ №2:

Вам нужно вызвать свой метод future внутри метода initstate . Как таковой, он будет запускаться только один раз при создании виджета, а не каждый раз при вызове setstate().

Комментарии:

1. Для этого вы можете использовать функцию комментариев, нет необходимости публиковать комментарий в качестве ответа.

2. Таким образом, как инициализировать значения асинхронным способом?