Flutter 的 onTap 方法打开存储在 Firestore 中的经纬度

Posted

技术标签:

【中文标题】Flutter 的 onTap 方法打开存储在 Firestore 中的经纬度【英文标题】:onTap method for Flutter to open longitude and latitude stored in Firestore 【发布时间】:2021-04-25 14:37:53 【问题描述】:

我正在尝试为选举部分创建一个搜索引擎,一旦找到选举部分

点击项目部分,它应该将我发送到我存储的经度和纬度

在 Firestore 中并在 Google 地图上显示为带有颤动的标记,但我无法创建

方法,最有效的方法是什么?

class SearchPage extends StatefulWidget 
  @override
  _SearchPageState createState() => _SearchPageState();


class _SearchPageState extends State<SearchPage> 
  TextEditingController textEditingController = TextEditingController();
  final database = Firestore.instance;
  String searchString;
  @override
  Widget build(BuildContext context) 
    return Scaffold(
        body: Column(
      children: <Widget>[
        Expanded(
          child: Column(
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.all(30.0),
                child: Container(
                  child: TextField(
                    onChanged: (val) 
                      setState(() 
                        searchString = val.toLowerCase();
                      );
                    ,
                    controller: textEditingController,
                    decoration: InputDecoration(
                        suffixIcon: IconButton(
                            icon: Icon(Icons.clear),
                            onPressed: () => textEditingController.clear()),
                        hintText: 'Buscar seccion',
                        hintStyle: TextStyle(
                            fontFamily: 'Antra', color: Colors.blueGrey)),
                  ),
                ),
              ),
              Expanded(
                child: StreamBuilder<QuerySnapshot>(
                  stream: (searchString == null || searchString.trim() == ' ')
                      ? Firestore.instance.collection('secciones').snapshots()
                      : Firestore.instance
                          .collection('secciones')
                          .where('searchIndex', arrayContains: searchString)
                          .snapshots(),
                  builder: (context, snapshot) 
                    if (snapshot.hasError) 
                      return Text('We got an error $snapshot.error');
                    
                    switch (snapshot.connectionState) 
                      case ConnectionState.waiting:
                        return Text('Cargando');
                      case ConnectionState.none:
                        return Text('Error de conexion');
                      case ConnectionState.done:
                        return Text('We are done!');

                      default:
                        return new ListView(
                            children: snapshot.data.documents
                                .map((DocumentSnapshot document) 
                          return new ListTile(
                              title: Text(document['estado']),
                              onTap: () 
                                Navigator.of(context).push(
                                  MaterialPageRoute(builder: (context) 
                                    return MapsScreen(
                                    );
                                  ),
                                );
                              );
                        ).toList());
                    
                  ,
                ),
              )
            ],
          ),
        )
      ],
    ));
  
  

这是您应该发送存储在 Firestore 中的位置的屏幕,

但我不知道该怎么做,我从视频中获取了方法

他们教你如何显示和存储当前的教程

Google 地图中的位置。

class MapsScreen extends StatefulWidget
  final String partyNumber;
  final String userId;

  const MapsScreen(Key key, this.userId, this.partyNumber) : super(key: key);

  @override
  _MapsScreenState createState() => _MapsScreenState();


class _MapsScreenState extends State<MapsScreen>
  GoogleMapController _mapController;
  Location _location = Location();
  StreamSubscription<LocationData> subscription;

  @override
  void initState()
    super.initState();

    _initLocation();
  

  _initLocation() async
    var _serviceEnabled = await _location.serviceEnabled();
    if(!_serviceEnabled) 
      _serviceEnabled = await _location.requestService();
      if(!_serviceEnabled)
        return;
      
    

    var _permissionGranted = await _location.hasPermission();
    if(_permissionGranted == PermissionStatus.DENIED)
      _permissionGranted = await _location.requestPermission();
      if(_permissionGranted != PermissionStatus.GRANTED)
        print("Sin permisos de GPS");
        return;
      
    

    subscription = _location.onLocationChanged().listen((LocationData event) 
      if(_mapController != null)
        _mapController.animateCamera(
          CameraUpdate.newLatLng(
            LatLng(event.latitude, event.longitude),
          ),
        );
      

      Firestore.instance
      .collection('seccion')
      .document(widget.partyNumber)
      .collection('people')
      .document(widget.userId)
      .setData(
        'lat': event.latitude,
        'lng': event.longitude,
      );
      print("$event.latitude, $event.longitude");
    );
  

  @override
  void dispose()
    if(subscription != null)
      subscription.cancel();
    

    Firestore.instance
        .collection('seccion')
        .document(widget.partyNumber)
        .collection('people')
        .document(widget.userId)
        .delete();
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text("Instituto Nacional Electoral"),
      ),
      body: GoogleMap(
        initialCameraPosition: CameraPosition(
          target: LatLng(16.879860202903764, -99.9013661857768),
          zoom: 15,
        ),
        zoomGesturesEnabled: true,
        myLocationEnabled: true,
        myLocationButtonEnabled: true,
        onMapCreated: (controller) => _mapController = controller,
      ),
    );
    
  

【问题讨论】:

【参考方案1】:

我不太确定你到底想完成什么。

我最初以为您将纬度和经度存储在 Firebase 中的某个位置,并希望在这些位置显示标记。

如果您想这样做,您需要从 Firebase 获取位置数据并将其传递到 GoogleMap。我不熟悉小部件本身,但从文档中可以看到:https://github.com/flutter/plugins/blob/f3024731b090659edaa92d01416549c690f65678/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart#L112 该小部件接受一组Markers

如果您在存储库中做了一点操作,您可以了解如何构建 Marker。然后您可以从 Firebase 中的位置数据构造一个或多个,并将它们传递给 GoogleMap 小部件。

如果那是你想要完成的。您发布的代码将当前用户位置保存到 Firebase,所以我不确定您的目标到底是什么。

【讨论】:

我在firestore中保存了纬度和经度,但我需要获取它们并将数据从一个窗口移动到另一个窗口,以便我可以使用它们,我不知道该怎么做使用这些坐标并将它们发送到 Google 地图窗口并访问该位置的标记。首先,我需要弄清楚如何将位置数据从一个窗口传递到另一个窗口。 要从 Firebase 中检索它们,您需要查看 Firebase 库以了解如何检索数据。如果您在点击处理程序中执行此操作,您可以使其异步并进行网络调用final coordinates = await getFromFirebase(),然后将这些值传递给您的小部件。根据您写的内容,我假设您有一个完整的单独页面要访问。在那里你可以使用 Flutter Navigator。看看如何在文档中构建路线。然后,您可以将您的坐标作为RouteSettings 的一部分传递给您的接收小部件。

以上是关于Flutter 的 onTap 方法打开存储在 Firestore 中的经纬度的主要内容,如果未能解决你的问题,请参考以下文章

Flutter GestureDetector,onTap自动触发,如何?

Flutter 中 DropDownMenu 按钮中的 OnTap 函数

Flutter 无法获取 ontap 函数来更改布尔列表

将文本传递给 RaisedButton OnTap - Flutter

OnTap 后刷新 Flutter ListView

Flutter中如何将onTap函数传递给ListTile?