Я создаю мобильное приложение во Флаттере, которое накладывает карту кампуса (слой KML) на карты Google и позволяет пользователям (сотрудникам и студентам) ориентироваться в кампусе и прокладывать маршруты к их зданиям в кампусе на основе определенного поиска.В конечном итоге этого будет гораздо больше, но это является его основой.
Я использую пакет allow_handler и могу получить разрешение на использование местоположения, а также определить, было ли отказано в разрешениивне приложения.С чем я сталкиваюсь, так это с переходом к экрану карты после получения разрешения.
Я попытался сделать это на экране карты и хотел, чтобы разрешения автоматически запрашивались при загрузке приложения, ноЯ получил цель! = Null error, и это было только тогда, когда я запросил разрешения с помощью кнопки.
Затем я решил создать страницу, которая будет отображаться перед доступом к карте.Я на самом деле предпочитаю этот подход, так как он позволяет мне добавить описание того, почему нам нужно местоположение.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import './theme.dart' as Theme;
import './screens/campus_map.dart';
...
...
...
// check permissions
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
PermissionHandler() // Check location permission has been granted
.checkPermissionStatus(PermissionGroup
.locationWhenInUse) //check permission returns a Future
.then(_updateStatus); // handling in callback to prevent blocking UI
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
// check permissions when app is resumed
// this is when permissions are changed in app settings outside of app
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
PermissionHandler()
.checkPermissionStatus(PermissionGroup.locationWhenInUse)
.then(_updateStatus);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
color: Theme.UniColors.primaryColour[500],
theme: Theme.uniThemeData,
routes: <String, WidgetBuilder>{
'campus_map': (BuildContext context) => new CampusMap(),
},
home: Scaffold(
backgroundColor: Colors.white,
body: Container(
padding: EdgeInsets.all(20.0),
child: Column(
children: <Widget>[
Expanded(
...
...
...
Expanded(
flex: 0,
child: Container(
child: InkWell(
borderRadius: BorderRadius.circular(20),
onTap: () {
_askPermission(); // ask user for permission
//Navigator.pushNamed(context, "campus_map");
},
...
...
...
],
),
),
),
);
}
void _updateStatus(PermissionStatus status) {
if (status != _status) {
// check status has changed
setState(() {
_status = status; // update
});
} else {
if (status != PermissionStatus.granted) {
PermissionHandler().requestPermissions(
[PermissionGroup.locationWhenInUse]).then(_onStatusRequested);
}
else{
print('SIGHSDVINSVUGSVDJSVDIHSVDISHVISHDVOSJADGBHSDFIBHDSFBOSDFBHDO');
Navigator.pushNamed(context, "campus_map");
}
}
}
void _askPermission() {
PermissionHandler().requestPermissions(
[PermissionGroup.locationWhenInUse]).then(_onStatusRequested);
}
void _onStatusRequested(Map<PermissionGroup, PermissionStatus> statuses) {
final status = statuses[PermissionGroup.locationWhenInUse];
if (status != PermissionStatus.granted) {
// On iOS if "deny" is pressed, open App Settings
PermissionHandler().openAppSettings();
} else {
_updateStatus(status);
}
}
}
Желаемый результат заключается в том, что я хочу, чтобы приложение переместилось на карту, показывая местоположение пользователей,но вместо этого я получаю эту ошибку.
Необработанное исключение: запрошена операция навигатора с контекстом, который не включает навигатор.