Мне нужно преобразовать широту и долготу для адреса из rest api в список - PullRequest
0 голосов
/ 10 июля 2020

Я получаю широту и долготу из rest api и мне приходится преобразовывать в адрес каждый раз, когда список загружается, но я получаю «Future» не является подтипом типа «String» Flutter . Я также пытался добавить FutureBuilder . Как решить эту проблему? Я новичок ie в дрожании.

 body: Container(
        child: Center(
          child: FutureBuilder(
            builder: (context, snapshot) {
              return ListView.builder(
                  physics: const AlwaysScrollableScrollPhysics(),
                  itemCount:
                  _getAttendanceLog == null ? 0 : _getAttendanceLog.length,
                  itemBuilder: (BuildContext context, int index) {
                    final item = _getAttendanceLog[index];
                     
                   return card(
                   child: Column(
                   children: <Widget>[
                       new Container(
                              child: Column(
                              children: <Widget>[
                              if(item.startlattitude == 'null'|| item.startlattitude == null||item.startlongitude == 'null'|| item.startlongitude == null) ...[
                              new Text("In Location : -", style: TextStyle(fontSize: SizeConfig.safeBlockHorizontal*3),)
                               ]else ...[
                               Marquee(
                               child: Text("In Location : " + getUserLocation(item.startlattitude, item.startlongitude),style: TextStyle(fontSize: SizeConfig.safeBlockHorizontal*3),),
                               directionMarguee: DirectionMarguee.oneDirection,
                               ),SizeConfig.safeBlockHorizontal*3),),
                               ]
                              ],
                            ),
                         ),
                    ])
                   )

, и я использовал Geocoder, также см. Ниже ======> getUserLocation

getUserLocation(startlat, startlong) async {

    final coordinates = new Coordinates(
        startlat, startlong);
    var addresses = await Geocoder.local.findAddressesFromCoordinates(
        coordinates);
    finalInLocation = addresses.first;
    print(' ${finalInLocation.locality}, ${finalInLocation.adminArea},${finalInLocation.subLocality}, ${finalInLocation.subAdminArea},${finalInLocation.addressLine}, ${finalInLocation.featureName},${finalInLocation.thoroughfare}, ${finalInLocation.subThoroughfare}');
    return finalInLocation;
  }

Мне вот так: введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы получаете сообщение об ошибке, потому что вы передаете Future параметру, который ожидает String.

Потому что вам нужно дождаться, пока api преобразует lat-long в текст адреса , вам нужно использовать FutureBuilder в дереве виджетов в том месте, где вам нужно отобразить текст адреса внутри вашего itemBuilder следующим образом ..

FutureBuilder(
            future: getUserLocation(lat, lon),
            builder: (context, snapshot) {
              if (snapshot.hasData == false) {
                return Text('loading...');
              } else {
                return Text(snapshot.data);
              }
            })

И вам нужно будет сделать свой getUserLocation метод, чтобы вернуть Future<String> вот так ..

Future<String> getUserLocation(startlat, startlong) async {
    //other code
    await //more code;
    return yourAddressString;
  }
0 голосов
/ 10 июля 2020

Вы можете использовать пакет Geocoder для преобразования широты и долготы в список адресов

final coordinates = new Coordinates(1.10, 45.50);
addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
first = addresses.first;
print("${first.featureName} : ${first.addressLine}");
...