当状态创建或状态设置时,Flutter 按钮 onpressed 功能不断被调用
Flutter buttons onpressed function continually being called when state created or state set
我正在使用 google 地图插件,并且有一个按钮可以在地图上添加标记。
问题是当屏幕第一次加载时,按钮函数 (_onAddMarkerButtonPressed) 被立即调用并在地图上放置了一个标记。我猜这是来自 createSate() 方法。
我还有一个文本视图,只要移动地图 (_onCameraMove),它就会更新为地图上的新位置地址。这是在更改该文本小部件中显示的字符串的值后调用 setState()。然而,这不仅仅是更新文本,它还会调用 _onAddMarkerButtonPressed 并在每次相机在地图上移动时添加一个新标记。所以我最终得到了满屏的标记。
感谢您的帮助。
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Completer<GoogleMapController> _controller = Completer();
static const LatLng _center = const LatLng(-31.950260, 115.851840);
final Set<Marker> _markers = {};
LatLng _lastMapPosition = _center;
@override
Widget build(BuildContext context) {
double mapWidth = MediaQuery.of(context).size.width;
double mapHeight = MediaQuery.of(context).size.height - 215;
double iconSize = 30.0;
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Stack(
alignment: Alignment(0.0, 0.0),
children: <Widget>[
GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(target: _center, zoom: 16.0),
mapType: MapType.normal,
markers: _markers,
onCameraMove: _onCameraMove,
),
Positioned(
top: 0,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Container(
decoration: BoxDecoration( borderRadius: BorderRadius.circular(10.0), color: Colors.white),
height: 75,
width: mapWidth,
child: Center(
child: Text(address))),
),
),
Positioned(
top: (mapHeight - iconSize)/ 2,
right: (mapWidth - iconSize)/ 2,
child: Icon(Icons.my_location, size: iconSize, color: Colors.black87,),
),
Positioned(
bottom: 24.0,
left: 24.0,
child: Icon(Icons.search, size: 40, color: Colors.blue,) ,
),
Positioned(
bottom: 24.0 - (42/2),
right: (mapWidth - 150)/ 2,
child: RoundedButton(title: 'Add Alert', color: Colors.lightBlueAccent, onPressed: _onAddMarkerButtonPressed()),
),
Positioned(
bottom: 24.00,
right: 24.0,
child: Icon(Icons.my_location, size: 40, color: Colors.blue,) ,
),
],
),
);
}
_onAddMarkerButtonPressed (){
setState(() {
_markers.add(Marker(
markerId: MarkerId(_lastMapPosition.toString()),
position: _lastMapPosition,
infoWindow: InfoWindow(
title: 'This is the title',
snippet: 'This is the snippet',
),
icon: BitmapDescriptor.defaultMarker,
),
);
});
}
_onCameraMove(CameraPosition position) async{
_lastMapPosition = position.target;
final coordinates = new Coordinates(position.target.latitude, position.target.longitude);
var addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
var first = addresses.first;
setState(() {
address = "${first.addressLine}";
});
}
你这行的错误
onPressed: _onAddMarkerButtonPressed()
因为无论何时将此小部件呈现给视图,您都在执行函数
你必须像这样在箭头函数中传递它
onPressed: () => _onAddMarkerButtonPressed()
我正在使用 google 地图插件,并且有一个按钮可以在地图上添加标记。
问题是当屏幕第一次加载时,按钮函数 (_onAddMarkerButtonPressed) 被立即调用并在地图上放置了一个标记。我猜这是来自 createSate() 方法。
我还有一个文本视图,只要移动地图 (_onCameraMove),它就会更新为地图上的新位置地址。这是在更改该文本小部件中显示的字符串的值后调用 setState()。然而,这不仅仅是更新文本,它还会调用 _onAddMarkerButtonPressed 并在每次相机在地图上移动时添加一个新标记。所以我最终得到了满屏的标记。
感谢您的帮助。
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Completer<GoogleMapController> _controller = Completer();
static const LatLng _center = const LatLng(-31.950260, 115.851840);
final Set<Marker> _markers = {};
LatLng _lastMapPosition = _center;
@override
Widget build(BuildContext context) {
double mapWidth = MediaQuery.of(context).size.width;
double mapHeight = MediaQuery.of(context).size.height - 215;
double iconSize = 30.0;
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Stack(
alignment: Alignment(0.0, 0.0),
children: <Widget>[
GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(target: _center, zoom: 16.0),
mapType: MapType.normal,
markers: _markers,
onCameraMove: _onCameraMove,
),
Positioned(
top: 0,
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Container(
decoration: BoxDecoration( borderRadius: BorderRadius.circular(10.0), color: Colors.white),
height: 75,
width: mapWidth,
child: Center(
child: Text(address))),
),
),
Positioned(
top: (mapHeight - iconSize)/ 2,
right: (mapWidth - iconSize)/ 2,
child: Icon(Icons.my_location, size: iconSize, color: Colors.black87,),
),
Positioned(
bottom: 24.0,
left: 24.0,
child: Icon(Icons.search, size: 40, color: Colors.blue,) ,
),
Positioned(
bottom: 24.0 - (42/2),
right: (mapWidth - 150)/ 2,
child: RoundedButton(title: 'Add Alert', color: Colors.lightBlueAccent, onPressed: _onAddMarkerButtonPressed()),
),
Positioned(
bottom: 24.00,
right: 24.0,
child: Icon(Icons.my_location, size: 40, color: Colors.blue,) ,
),
],
),
);
}
_onAddMarkerButtonPressed (){
setState(() {
_markers.add(Marker(
markerId: MarkerId(_lastMapPosition.toString()),
position: _lastMapPosition,
infoWindow: InfoWindow(
title: 'This is the title',
snippet: 'This is the snippet',
),
icon: BitmapDescriptor.defaultMarker,
),
);
});
}
_onCameraMove(CameraPosition position) async{
_lastMapPosition = position.target;
final coordinates = new Coordinates(position.target.latitude, position.target.longitude);
var addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
var first = addresses.first;
setState(() {
address = "${first.addressLine}";
});
}
你这行的错误
onPressed: _onAddMarkerButtonPressed()
因为无论何时将此小部件呈现给视图,您都在执行函数
你必须像这样在箭头函数中传递它
onPressed: () => _onAddMarkerButtonPressed()