#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. Таким образом, как инициализировать значения асинхронным способом?