flutter - 如何在 FLUTTER 中设置一个按钮以重定向到我的地图?
问题描述
我仍然是 Flutter 的初学者,我正在开发一个应用程序,但我遇到了一个问题:
有我的 main.dart:
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
final geoService = GeolocatorService();
@override
Widget build(BuildContext context) {
return FutureProvider(
create: (context) => geoService.getCurrentPosition(),
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Metz Trip',
theme: ThemeData(
primarySwatch: Colors.red,
),
home:
Consumer<Position>(
builder: (context, position, widget) {
return (position != null)
? Map(position)
: Center(child: CircularProgressIndicator());
},
),
),
);
如您所见,我的主页是地图,但问题是:如何设置按钮以重定向到此页面?
例如,如果我重定向到Map()
我有这个错误:
The return type 'Map<dynamic, dynamic>' isn't a 'Widget', as required by the closure's context.
有我的地图页面:
class Map extends StatefulWidget {
final Position initialPosition;
Map(this.initialPosition);
@override
State<StatefulWidget> createState() => _MapState();
}
class _MapState extends State<Map> {
final GeolocatorService geoService = GeolocatorService();
Completer<GoogleMapController> _controller = Completer();
@override
void initState() {
geoService.getPositionStream().listen((position) {
centerScreen(position);
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: <Widget>[
GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(widget.initialPosition.longitude,
widget.initialPosition.latitude),
zoom: 13.0),
mapType: MapType.normal,
myLocationEnabled: true,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
}),
Positioned(
top: 65.0,
right: 15.0,
left: 15.0,
child: Container(
height: 50.0,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30.0),
color: Colors.white),
child: TextField(
decoration: InputDecoration(
hintText: 'Votre recherche',
border: InputBorder.none,
contentPadding: EdgeInsets.only(left: 25.0, top: 15.0),
suffixIcon: IconButton(
icon: Icon(Icons.account_circle),
color: Colors.yellow[800],
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => Connexion()));
/*onPressed: () {
return FutureBuilder<User>(
future: FirebaseAuth.instance.currentUser,
builder: (context, snapshot) {
if (snapshot.hasData) {
User user = snapshot.data;
return ProfilePage(uid: user.uid);
} else {
return Connexion();
}
},
);*/
},
iconSize: 32.0),
prefixIcon: IconButton(
icon: Icon(Icons.location_on),
color: Colors.grey,
onPressed: () {},
iconSize: 32.0)),
),
),
),
Positioned(
right: 0.0,
left: 0.0,
bottom: -20.0,
child: Container(
height: 50.0,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(0.0),
color: Colors.grey[100].withOpacity(0.94)),
)),
Positioned(
right: 15.0,
left: 15.0,
bottom: 20.0,
child: Container(
height: 50.0,
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7.0),
color: Colors.red[900].withOpacity(0.95)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconButton(
icon: Icon(Icons.hotel),
color: Colors.white,
onPressed: () {},
),
IconButton(
icon: Icon(Icons.restaurant),
color: Colors.white,
onPressed: () {},
),
SizedBox(
width: 40,
),
IconButton(
icon: Icon(Icons.local_activity),
color: Colors.white,
onPressed: () {},
),
IconButton(
icon: Icon(Icons.museum),
color: Colors.white,
onPressed: () {},
),
],
),
),
),
],
),
floatingActionButton: FloatingActionButton(
backgroundColor: Colors.yellow[800],
onPressed: () {},
elevation: 15.0,
child: const Icon(
Icons.home,
color: Colors.white,
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
);
}
// ignore: missing_return
Future<Void> centerScreen(Position position) async {
final GoogleMapController controller = await _controller.future;
controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
target: LatLng(position.latitude, position.longitude), zoom: 13.0)));
}
}
和我的地理定位服务页面:
class GeolocatorService {
Future<Position> getLastKnownPosition({
bool forceAndroidLocationManager = false,
}) =>
Geolocator.getLastKnownPosition(
forceAndroidLocationManager: forceAndroidLocationManager);
Future<Position> getCurrentPosition({
LocationAccuracy desiredAccuracy = LocationAccuracy.best,
bool forceAndroidLocationManager = false,
Duration timeLimit,
}) =>
Geolocator.getCurrentPosition(
desiredAccuracy: desiredAccuracy,
forceAndroidLocationManager: forceAndroidLocationManager,
timeLimit: timeLimit,
);
Stream<Position> getPositionStream({
LocationAccuracy desiredAccuracy = LocationAccuracy.best,
int distanceFilter = 10,
bool forceAndroidLocationManager = false,
int timeInterval = 0,
Duration timeLimit,
}) =>
Geolocator.getPositionStream(
desiredAccuracy: desiredAccuracy,
distanceFilter: distanceFilter,
forceAndroidLocationManager: forceAndroidLocationManager,
// ignore: deprecated_member_use
timeInterval: timeInterval,
timeLimit: timeLimit,
);
}
我希望有人可以帮助我,谢谢你们。
解决方案
在这种情况下,您可以将页面名称称为“MapPage”会更好,但如果您坚持保留地图名称,您可以这样做:
import '../../models/map.dart' as MapPage;
然后你可以简单地这样调用:
return (position != null)
? MapPage.Map(position)
: Center(child: CircularProgressIndicator());
我强烈建议更改名称,因为如果您与 Flutter 中的其他类名称相同,您将始终与 Flutter 发生冲突。
推荐阅读
- c# - 无法获取 dll 文件的第 3 方数字签名
- php - Laravel 自定义时间表
- php - 对整数使用 LIKE
- r - RStudio 字符编码
- ios - Firestore 到 TableView [Swift]
- azure - 如何使用 Odata 链接服务将文件从共享点复制到 blob 存储 Azure 数据工厂 v2
- bash - 如何将 bash 脚本作为命令运行?
- python-3.x - 网格中的关键事件检测 - wxPython
- hyperlink - Django REST Framework - 列出具有可能操作的项目
- c# - 如何在我的类(模型)中公开用户,或在我的视图中列出所有用户?