【问题标题】:Flutter How to Sync between Name and Calculate DistanceFlutter 如何在名称和计算距离之间同步
【发布时间】:2020-05-05 09:43:20
【问题描述】:

我有带有名称、纬度和经度的数据市场。 tats经纬度用于计算用户与市场的距离。

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});
}

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 _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.add(0.00);
            }
          } 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,
                );
              });
        },
      ),
    );
  }
}

但在此代码中,nameDest 和计算距离之间不同步数据。如何解决?

也许我可以将计算距离存储到数据数组 newRange null 中吗?

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

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

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

如果可以存储计算距离在newRange。那么我如何将数据存储到数组中呢? 还是有其他方法可以使名称和距离数据保持同步?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您走在正确的道路上,您可以在课堂上使用该新变量。但是,为此您必须创建自己的排序算法来交换对象在列表中的位置。

    观看完整的演示有助于您进一步了解。

    class DeleteWidget extends StatefulWidget {
      @override
      _DeleteWidgetState createState() => _DeleteWidgetState();
    }
    
    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 = -6.163891; //position.latitude;
          lastLongitude = 106.628915; //position.longitude;
        } catch (e) {
          print("Permission Denied");
        }
        return 1;
      }
    
      void bubbleSort() {
        int n = newSortRange.length;
        int i, step;
        for (step = 0; step < n; step++) {
          for (i = 0; i < n - step - 1; i++) {
            if (newSortRange[i] > newSortRange[i + 1]) {
              swap(i);
            }
          }
        }
      }
    
      void swap(int i) {
        double temp = newSortRange[i];
        newSortRange[i] = newSortRange[i + 1];
        newSortRange[i + 1] = temp;
        Data _data = dataInstance[i];
        dataInstance[i] = dataInstance[i + 1];
        dataInstance[i + 1] = _data;
      }
    
      @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.add(0.00);
                }
              } 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)));
                  dataInstance[i].newRange = 12742 * asin(sqrt(a));
                }
              }
              bubbleSort();
              //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: Column(
                              children: [
                                Text(
                                  newSortRange[index].toStringAsFixed(2) + "\nKM",
                                  style: new TextStyle(
                                    fontSize: 13,
                                  ),
                                  textAlign: TextAlign.right,
                                ),
                                Text('${dataInstance[index].newRange}')
                              ],
                            ),
                          ),
                        ],
                      ),
                    );
                  },
                  separatorBuilder: (context, index) {
                    return Divider(
                      height: 0.0,
                      thickness: 0.7,
                    );
                  });
            },
          ),
        );
      }
    }
    
    class Market {
      static List<Data> dataMarket = [
        Data(
            nameDest: 'Alfamart',
            latitudeDest: -6.163891,
            longitudeDest: 106.628915,
            newRange: -1),
        Data(
            nameDest: 'Minis',
            latitudeDest: -6.211269,
            longitudeDest: 106.615574,
            newRange: null),
        Data(
            nameDest: 'Star Market',
            latitudeDest: -6.223254,
            longitudeDest: 106.703905,
            newRange: null),
        Data(
            nameDest: 'Allmark',
            latitudeDest: -6.163891,
            longitudeDest: 106.628915,
            newRange: null),
        Data(
            nameDest: 'Eig Store',
            latitudeDest: -6.178293,
            longitudeDest: 106.631862,
            newRange: null),
      ];
    }
    
    class Data {
      var nameDest;
      var latitudeDest;
      var longitudeDest;
      var newRange;
    
      Data({this.nameDest, this.latitudeDest, this.longitudeDest, this.newRange});
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2019-10-09
      • 2016-05-11
      • 1970-01-01
      相关资源
      最近更新 更多