import 'package:flutter/material.dart'; import '../api/oa_client.dart'; import '../device/device_bridge.dart'; import '../theme.dart'; import 'tencent_map_thumb.dart'; class LocationViewPage extends StatelessWidget { const LocationViewPage({ super.key, required this.api, required this.title, required this.address, this.lat, this.lng, }); final OaClient api; final String title; final String address; final double? lat; final double? lng; Future _openMaps(BuildContext context) async { if (lat == null || lng == null) return; final la = lat!; final ln = lng!; final q = Uri.encodeComponent(title.isNotEmpty ? title : '$la,$ln'); final urls = [ 'https://uri.amap.com/marker?position=$ln,$la&name=$q', 'geo:$la,$ln?q=$la,$ln($q)', ]; for (final u in urls) { try { await DeviceBridge.openUrl(u); return; } catch (_) {} } if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('无法打开地图'))); } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar(title: const Text('位置')), body: ListView( children: [ if (lat != null && lng != null) TencentMapThumb(api: api, lat: lat!, lng: lng!, width: MediaQuery.sizeOf(context).width, height: 220), Padding( padding: const EdgeInsets.fromLTRB(16, 16, 16, 8), child: Text(title.isEmpty ? '位置' : title, style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600)), ), if (address.isNotEmpty) Padding( padding: const EdgeInsets.fromLTRB(16, 0, 16, 16), child: Text(address, style: const TextStyle(fontSize: 14, color: kMute)), ), Padding( padding: const EdgeInsets.all(16), child: FilledButton.icon( onPressed: lat == null ? null : () => _openMaps(context), icon: const Icon(Icons.map_outlined), label: const Text('用地图打开'), ), ), ], ), ); } }