Я пытаюсь реализовать Column
с Text
:
Column(
children: <Widget>[
Text('data from future function')
],
),
Я не могу получить данные от initState()
, потому что initState()
это только void
Если я получаю данные непосредственно из функции
Text(function)
я получил
instance of function
Функция:
Future<double> calculate(int index) async {
LocData _getUser = await getLoc();
double uLat = _getUser.latitude;
double uLng = _getUser.latitude;
double pLat = parks[data].loc.lat;
double pLng = parks[data].loc.lng;
double dis = await Geolocator()
.distanceBetween(uLat , uLng, uLng , pLat );
return dis ;
}
Любая идея, что я могу сделать, чтобы получить эти данные из функции непосредственно в текстовый виджет?
Функция, которая возвращает двойное значение. Функция проверена и работает нормально
Вот полный рабочий код.
class _InfoPageState extends State<InfoPage> {
String _text = "";
@override
void initState() {
super.initState();
calculate(10).then((value) {
setState(() {
_text = value.toString();
});
});
}
Future<double> calculate(int index) async {
LocData _getUser = await getLoc();
double uLat = _getUser.latitude;
double uLng = _getUser.latitude;
double pLat = parks[data].loc.lat;
double pLng = parks[data].loc.lng;
double dis = await Geolocator().distanceBetween(uLat, userLng, uLng, pLat);
return dis;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Column(children: <Widget>[Text(_text)]),
);
}
}
Под этой строкой _InfoPageState расширяет State<InfoPage>, я только что понял, что не могу получить доступ к функции в этой строке, потому что я получаю эту функцию с другой страницы. Попытался вызвать text = await widget.function, но «виджет» не не распознать в этой части кода. да, я обновлю вопрос с помощью функции
Есть 2 способа получить данные из будущего.
Опция 1:
(с 2 подопциями)
class MyWidgetState extends State<MyWidget> {
String _someAsyncData;
@override
void initState() {
super.initState();
// opt 1.
aDataFuture.then((val) {
setState(() {
_someAsyncdata = val;
});
});
// opt 2.
_setAsyncData(aDataFuture);
}
void _setAsyncData(Future<String> someFuture) async {
// void + async is considered a "fire and forget" call
// part of opt. 2
_someAsyncData = await someFuture;
// must trigger rebuild with setState
setState((){});
}
Widget build(BuildContext context) {
return _someAsyncData == null ? Container() : Text('$_someAsyncData');
}
}
Вариант №2
Используйте FutureBuilder
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return FutureBuilder<String>(
future: _someFuture,
builder: (ctx, snapshot) {
// can also check for snapshot.hasData or snapshot.hasError to
// provide more user feedback eg.
if (snapshot.connectionState == ConnectionState.done)
return Text('${snapshot.data}');
return Text('No data available yet...');
}
);
}
}
Какой у тебя
function
?