Flutter: результаты сортировки данных (из данных массива) не отображаются в ListView - PullRequest
0 голосов
/ 05 мая 2020

Я использую массивы для хранения «данных о местонахождении рынка» и сохраняю данные в файле Data.dart

Data.dart

class Market{
  static List dataMarket = [
    Data(
        nameDest = 'Alfamart',
        latitudeDest: -6.163891,
        longitudeDest: 106.628915),
    Data(
        nameDest = 'Minis'
        latitudeDest: -6.211269,
        longitudeDest: 106.615574),
    Data(
        nameDest = 'Star Market'
        latitudeDest: -6.223254,
        longitudeDest:  106.703905),
    Data(
        nameDest = 'Allmark'
        latitudeDest: -6.163891,
        longitudeDest: 106.628915),
    Data(
        nameDest = 'Eig Store'
        latitudeDest: -6.178293, 
        longitudeDest: 106.631862),
  ];
}

class Data{
  String nameDest;
  var latitudeDest;
  var longitudeDest;


  Data({
     this.nameDest
     this.latitudeDest,
     this.longitudeDest});
}

и i используйте эти «данные о местоположении на рынке» для расчета расстояния между пользователем и рынком. и я также хочу отобразить из ближайшего рыночного ордера

MyListMarket.dart

import 'package:example/Data.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:math' show cos, sqrt, asin;

import 'package:geolocator/geolocator.dart';


class TabMarket extends StatefulWidget{
  @override
  _TabMarketState createState() => _TabMarketState();
}

class _TabMarketState extends State<TabMarket> {
  var lastLatitude;
  var lastLongitude;


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


  Future<void> _initUserLocation() async {
    try {
      Position position = await Geolocator()
          .getLastKnownPosition(desiredAccuracy: LocationAccuracy.best);
      lastLatitude = position.latitude;
      lastLongitude = position.longitude;
    } catch (e) {
      print("Permission Denied");
    }
  }



  @override
  Widget build(BuildContext context) {
    final dataInstance = Market.dataMarket;
    var newSortRange = [];

    if (lastLatitude == null || lastLongitude == null){
      for(int i = 0; i >= dataInstance.length; i++) {
        newSortRange[i] = 0;
      }
    }else{for (int i = 0; i >= dataInstance.length; i++) {
      //calculating distance with lat1, lon1, lat2, lon2

      var p = 0.017453292519943295;
      var c = cos;
      var a = 0.5 - c((dataInstance[i].latitudeDest - lastLatitude) * p) / 2 +
              c(lastLatitude * p) * c(dataInstance[i].latitudeDest * p) *
              (1 - c((dataInstance[i].longitudeDest - lastLongitude) * p)) / 2;
      newSortRange[i] = 12742 * asin(sqrt(a));
    }}
    newSortRange.sort();
    //i wanna sort this data from the smallest number
    //already tried with newSortRange.sort((a,b) => a.compareTo(b));

    return Scaffold(
      backgroundColor: Color.fromRGBO(246, 246, 246, 1),
      body: FutureBuilder(
        future: _initUserLocation(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          return ListView.separated(
              key: PageStorageKey<String>('aKey'),
              physics: BouncingScrollPhysics(),
              itemCount: newSortRange.length,
              itemBuilder: (context, index) {

                return Material(
                  color: Color.fromRGBO(251, 251, 251, 1),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      ListTile(
                        leading: Text(dataInstance[index].nameDest)
                        trailing: Text(newSortRange[index].toStringAsFixed(2) +
                            "\nKM",
                          style: new TextStyle(fontSize: 13,),
                          textAlign: TextAlign.right,),
                      ),
                    ],),);
              },

              separatorBuilder: (context, index) {
                return Divider(
                  height: 0.0,
                  thickness: 0.7,
                );
              }
          );
        },
      ),
    );
  }
}

, поэтому я попытался рассчитать расстояние с помощью l oop и сохраните его в новом массиве

мой код не имеет ошибок, но не отображается ничего, только пустое без просмотра списка. может быть, неправильный метод хранения данных в массиве? Как я могу это решить?

1 Ответ

0 голосов
/ 05 мая 2020

Поскольку ваш метод _initUserLocation является асинхронным c, поэтому, даже если вы вызываете в initstate, вы также не можете рассчитать другие значения на основе этого метода сборки, потому что в этом методе _initUserLocation не удалось выполнить свою задачу.

В Future Builder вы должны рассчитывать все, где вы можете видеть фактические данные, потому что будущий строитель предоставит данные, когда процесс будет завершен.

Вы должны вернуть любые данные из будущего метода, чтобы futurebuilder мог понять полный расчет метода сейчас.

Я внес много изменений в ваш код, который работает нормально.

Сообщите мне, работает он для вас или нет, а также не стесняйтесь задавать любые вопросы, если вы не понимаете какую-либо часть код.

Полная рабочая демонстрация:

 class _DeleteWidgetState extends State<DeleteWidget> {
  var lastLatitude;
  var lastLongitude;
  final dataInstance = Market.dataMarket;
  var newSortRange = [];

  @override
  void initState() {
    super.initState();
    //_initUserLocation();
  }

  Future<int> _initUserLocation() async {
    try {
      await Future.delayed(Duration(seconds: 1));
      Position position = await Geolocator()
             .getLastKnownPosition(desiredAccuracy: LocationAccuracy.best);
      lastLatitude = position.latitude;
      lastLongitude = position.longitude;
    } catch (e) {
      print("Permission Denied");
    }
    return 1;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color.fromRGBO(246, 246, 246, 1),
      body: FutureBuilder(
        future: _initUserLocation(),
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (!snapshot.hasData) {
            return CircularProgressIndicator();
          }
          if (lastLatitude == null || lastLongitude == null) {
            for (int i = 0; i < dataInstance.length; i++) {
              newSortRange[i] = 0;
            }
          } else {
            for (int i = 0; i < dataInstance.length; i++) {
              //calculating distance with lat1, lon1, lat2, lon2

              var p = 0.017453292519943295;
              var c = cos;
              var a = 0.5 -
                  c((dataInstance[i].latitudeDest - lastLatitude) * p) / 2 +
                  c(lastLatitude * p) *
                      c(dataInstance[i].latitudeDest * p) *
                      (1 -
                          c((dataInstance[i].longitudeDest - lastLongitude) *
                              p)) /
                      2;
              newSortRange.add(12742 * asin(sqrt(a)));
            }
          }
          newSortRange.sort();
          print(newSortRange);
          return ListView.separated(
              key: PageStorageKey<String>('aKey'),
              physics: BouncingScrollPhysics(),
              itemCount: newSortRange.length,
              itemBuilder: (context, index) {
                return Material(
                  color: Color.fromRGBO(251, 251, 251, 1),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      ListTile(
                        trailing: Text(
                          newSortRange[index].toStringAsFixed(2) + "\nKM",
                          style: new TextStyle(
                            fontSize: 13,
                          ),
                          textAlign: TextAlign.right,
                        ),
                      ),
                    ],
                  ),
                );
              },
              separatorBuilder: (context, index) {
                return Divider(
                  height: 0.0,
                  thickness: 0.7,
                );
              });
        },
      ),
    );
  }
}

class Market {
  static List dataMarket = [
    Data(latitudeDest: -6.163891, longitudeDest: 106.628915),
    Data(latitudeDest: -6.211269, longitudeDest: 106.615574),
    Data(latitudeDest: -6.223254, longitudeDest: 106.703905),
    Data(latitudeDest: -6.163891, longitudeDest: 106.628915),
    Data(latitudeDest: -6.178293, longitudeDest: 106.631862),
  ];
}

class Data {
  var latitudeDest;
  var longitudeDest;

  Data({this.latitudeDest, this.longitudeDest});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...