![](/img/trans.png)
[英]how to pass the void function from same widget to another widget and then return the same void function from another widget to same widget in flutter
[英]Pass coordinates Latlng from map widget to Void function in the same screen
我是 Flutter 世界和移動應用程序開發的新手,並且正在為如何在我的應用程序中傳遞數據而苦苦掙扎。 This is my code, How can I pass Latlng cordinate from the google map widget (when I press the map and get a new marker) to the parameter Coord of Addlocation function and converted them from Latlng to double , because the map widget returns the coordinates在Latlng類型和我的Location class 中,坐標是double 。 請幫忙。
import 'dart:async';
import 'dart:convert';
import 'dart:html';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:rounded_loading_button/rounded_loading_button.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sidebar_animation/Models/Location.dart';
import 'package:sidebar_animation/Services/DataHelpers.dart';
import 'package:http/http.dart' as http;
class AddLocation extends StatefulWidget {
AddLocation({Key key, this.title}) : super(key: key);
final String title;
@override
AddLocationState createState() => AddLocationState();
}
class AddLocationState extends State<AddLocation> {
GoogleMapController _controller;
final CameraPosition _initialPosition =
CameraPosition(target: LatLng(24.903623, 67.198367));
final List<Marker> markers = [];
bool _isLoading = false;
bool t3ada = false;
bool faregh = false;
final RoundedLoadingButtonController _btnController =
new RoundedLoadingButtonController();
final TextEditingController sitenameController = new TextEditingController();
final TextEditingController descriptionController =
new TextEditingController();
addMarker(cordinate) {
int id = Random().nextInt(1);
setState(() {
markers
.add(Marker(position: cordinate, markerId: MarkerId(id.toString())));
});
}
@override
Widget build(BuildContext context) {
final _key = GlobalKey<FormState>();
return Scaffold(
body: Stack(
children: [
Column(
children: [
Form(
key: _key,
child: Column(
children: <Widget>[
Container(
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey[100]))),
child: TextFormField(
validator: (value) {
if (value.isEmpty) {
return "Site name cannot be empty !";
} else
return null;
},
controller: sitenameController,
decoration: InputDecoration(
icon: Icon(Icons.place, color: Colors.grey[400]),
border: InputBorder.none,
hintText: "Site name",
hintStyle: TextStyle(color: Colors.grey[400])),
),
),
Container(
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: Colors.grey[100]))),
child: TextFormField(
validator: (value) {
if (value.isEmpty) {
return "Description cannot be empty !";
} else
return null;
},
controller: descriptionController,
decoration: InputDecoration(
icon: Icon(Icons.email, color: Colors.grey[400]),
border: InputBorder.none,
hintText: "Description",
hintStyle: TextStyle(color: Colors.grey[400])),
),
),
],
),
),
Expanded(
child: GoogleMap(
initialCameraPosition: _initialPosition,
mapType: MapType.normal,
onMapCreated: (controller) {
setState(() {
_controller = controller;
});
},
markers: markers.toSet(),
onTap: (cordinate) {
_controller
.animateCamera(CameraUpdate.newLatLng(cordinate));
addMarker(cordinate);
},
),
),
SizedBox(
height: 30,
),
buttonSection(),
],
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_controller.animateCamera(CameraUpdate.zoomOut());
},
child: Icon(Icons.zoom_out),
),
);
}
DatabaseHelper2 databaseHelper2 = new DatabaseHelper2();
final _key = GlobalKey<FormState>();
void _doSomething() async {
Timer(Duration(seconds: 1), () {
print("button pressed ");
print(" Site name" + sitenameController.text);
print(" description" + descriptionController.text);
print(" Coordinates" + Coord.toString());
_btnController.stop();
Addlocation(sitenameController.text, Coord, descriptionController.text);
_btnController.stop();
});
}
void Addlocation(String sitename, double Coord, String description) async {
final prefs = await SharedPreferences.getInstance();
final key = 'token';
final value = prefs.get(key) ?? 0;
var jsonResponse = null;
String myUrl = DatabaseHelper2.serverUrl + "/location/Add?token=" + value;
http.Response response = await http.post(myUrl, headers: {
'Accept': 'application/json',
//'Authorization': 'token $value'
}, body: {
"SiteName": "$sitename",
"Coordinates": "$Coord",
"Description": "$description",
}).then((response) {
print('Response status : ${response.statusCode}');
print('Response body : ${response.body}');
});
print(response.body);
}
buttonSection() {
return Container(
height: 50,
child: AspectRatio(
child: RoundedLoadingButton(
color: Colors.amberAccent,
child: Text("Add", style: TextStyle(color: Colors.white)),
controller: _btnController,
onPressed: _doSomething,
),
aspectRatio: 8,
),
);
}
}
這是我的 class位置
// To parse this JSON data, do
//
// final location = locationFromJson(jsonString);
import 'dart:convert';
List<Location> locationFromJson(String str) => List<Location>.from(json.decode(str).map((x) => Location.fromJson(x)));
String locationToJson(List<Location> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class Location {
Location({
this.automaticIrrigation,
this.coordinates,
this.createdDate,
this.sensorIds,
this.id,
this.siteName,
this.description,
this.v,
});
bool automaticIrrigation;
List<double> coordinates;
DateTime createdDate;
List<String> sensorIds;
String id;
String siteName;
String description;
int v;
factory Location.fromJson(Map<String, dynamic> json) => Location(
automaticIrrigation: json["AutomaticIrrigation"],
coordinates: List<double>.from(json["Coordinates"].map((x) => x.toDouble())),
createdDate: DateTime.parse(json["Created_date"]),
sensorIds: List<String>.from(json["Sensor_ids"].map((x) => x)),
id: json["_id"],
siteName: json["SiteName"],
description: json["Description"],
v: json["__v"],
);
Map<String, dynamic> toJson() => {
"AutomaticIrrigation": automaticIrrigation,
"Coordinates": List<dynamic>.from(coordinates.map((x) => x)),
"Created_date": createdDate.toIso8601String(),
"Sensor_ids": List<dynamic>.from(sensorIds.map((x) => x)),
"_id": id,
"SiteName": siteName,
"Description": description,
"__v": v,
};
}
最后,我需要從 map 小部件獲取坐標到 Addlocation function 並將它們從 Latlng 轉換為 Double。
檢查此代碼,它與您的案例位置 model 相似(放置模型)
import 'dart:io';
import 'package:flutter/foundation.dart';
class PlaceLocation {
final double latitude;
final double longitude;
final String address;
const PlaceLocation({
@required this.latitude,
@required this.longitude,
this.address,
});
}
class Place {
final String id;
final String title;
final location;
final File image;
Place({
@required this.id,
@required this.title,
@required this.location,
@required this.image,
});
}
import 'dart:io';
import 'package:flutter/foundation.dart';
import '../models/place.dart';
final updatedLocation = PlaceLocation(
latitude: pickedLocation.latitude,
longitude: pickedLocation.longitude,
address: address);
final newPlace = Place(
id: DateTime.now().toIso8601String(),
title: pickedTitle,
location: updatedLocation,
image: pickedImage,
);
_items.add(newPlace);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.