颤振谷歌地图图像标记不会出现在中心

Posted

技术标签:

【中文标题】颤振谷歌地图图像标记不会出现在中心【英文标题】:Flutter google map Image marker wont come in the center 【发布时间】:2021-11-03 00:07:15 【问题描述】:

在我的 Flutter 应用程序中,我想在我的谷歌地图中心添加一个标记图像和 spinkit,但它却显示在一个白色容器内。并且不在地图上。 我怎样才能把它放在中心,并且在地图移动时它应该保持静止。 以下是问题的图片:

image of the issue

setState(()
  currentLocation = LatLng(locationData.latitude, locationData.longitude);
);
void onCreated(GoogleMapController controller)
  _mapController = controller;

return Scaffold(
  body: SafeArea(
    child:Stack(
      children:[
        Column(
          children:[
            Expanded(
              child: GoogleMap(
                initialCameraPosition: CameraPosition(
                  target: currentLocation,
                  zoom:14.4746,
                ),
                zoomControlsEnabled: false,
                minMaxZoomPreference: MinMaxZoomPreference(1.5,20.8),
                myLocationEnabled: true,
                myLocationButtonEnabled: true,
                mapType: MapType.normal,
                mapToolbarEnabled: true,
                onCameraMove: (CameraPosition position)
                
                  setState(()
                    _locating=true;
                  );
                  locationData.onCameraMove(position);
                ,
                onMapCreated: onCreated,
                onCameraIdle: ()
                  setState(()
                    _locating=false;
                  );
                  locationData.getMoveCamera();
                ,
              ),
            ),
            Center(
              child: Container(
                height:50,
                // margin:EdgeInsets.only(bottom:40),
                child: Image.asset('images/marker.png'),
            ),
            ),
            Center(
              child: SpinKitPulse(
                color:Colors.black54,
                size:100.0,
              ) ,
            ),

            Container(
              height:230,
              width:MediaQuery.of(context).size.width,
              color: Colors.white,
              child:Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children:[
                  _locating ? LinearProgressIndicator(
                    backgroundColor: Colors.transparent,
                    valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryColor),
                  ) : Container(),
                  Padding(
                    padding: const EdgeInsets.only(left: 10, right: 20),
                    child: TextButton.icon(
                      onPressed:(),
                      icon: Icon(
                        Icons.location_searching,
                        color: Theme.of(context).primaryColor,
                      ),
                      label: Flexible(
                        child: Text(
                         _locating ? 'Locating'
                             : locationData.selectedAddress.featureName,
                          overflow:TextOverflow.ellipsis,
                          style: TextStyle(
                              fontWeight:FontWeight.bold,
                            fontSize: 20,
                            color: Colors.black,
                          ),
                        ),
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.only(left: 20, right: 20),
                    child: Text(
                      _locating ? '': locationData.selectedAddress.addressLine,
                      style: TextStyle(color:Colors.black54),
                    ),
                  ),
                  SizedBox(height:30,),
                  Padding(
                    padding: const EdgeInsets.all(15.0),
                    child: SizedBox(
                      width: MediaQuery.of(context).size.width-40,
                      child: AbsorbPointer(
                        absorbing: _locating ? true : false,
                        child: TextButton(
                          style:TextButton.styleFrom(
                            backgroundColor:_locating ? Colors.grey: Theme.of(context).primaryColor,
                          ),
                          onPressed:()
                            if(_loggedIn==false)
                              Navigator.pushNamed(context, LoginScreen.id);
                            
                            else
                              _auth.updateUser(
                                id: user.uid,
                                number: user.phoneNumber,
                                latitude:locationData.latitude,
                                longitude:locationData.longitude,
                                address: locationData.selectedAddress.addressline,
                              );
                              Navigator.pushNamed(context, HomeScreen.id);
                            
                          ,
                          child: Text(
                            'CONFIRM LOCATION',
                            style: TextStyle(
                                color: Colors.white,
                            ),
                          ),

                        ),
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ],
    ),
  ),
);

【问题讨论】:

【参考方案1】:

如果您简化小部件树,您可以看到所有内容都放在Column 中,而不是Stack

return Scaffold(
  body: SafeArea(
    child: Stack( // remove this
      children:[
        Column(
          children:[
            Expanded(...),
            Center(...),
            Center(...),

            Container(
              height:230,
              width:MediaQuery.of(context).size.width,
              color: Colors.white,
              child:Column(...),
            ),
          ],
        ),
      ],
    ),
  ),
);

您应该删除第一个Stack 小部件,因为它不执行任何操作,而是将仅地图和标记放在它们自己的Stack 中。像这样的:

return Scaffold(
  body: SafeArea(
    child: Column(
      children: [
        Expanded( 
          child: Stack(
            children: [
              GoogleMap(...),
              Center(...), // the marker
              Center(...), // some other part of the marker, I assume
            ],
          ),
        ),
        // Other contents below the map
        Container(
          height: 230,
          width: MediaQuery.of(context).size.width,
          color: Colors.white,
          child: Column(...),
        ),
      ],
    ),
  ),
);

我无法运行代码,因为它不完整,所以可能存在一些语法错误,但希望我传达了这个想法。

【讨论】:

非常感谢您,非常感谢您UUUUUUUUU @vansika 如果答案对您有帮助,请考虑接受:)

以上是关于颤振谷歌地图图像标记不会出现在中心的主要内容,如果未能解决你的问题,请参考以下文章

居中所有标记和折线谷歌地图插件颤振适合屏幕

用户如何在谷歌地图颤振上添加多个标记

无法在谷歌地图中添加多个标记(颤振)

如何在颤振中使用 json API 在谷歌地图中添加标记?

如何获取谷歌地图的屏幕中心位置?

在谷歌地图android中更改标记的原点