Навигация после предоставления разрешения на местоположение - PullRequest
0 голосов
/ 19 сентября 2019

Я создаю мобильное приложение во Флаттере, которое накладывает карту кампуса (слой 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);
    }
  }
}


Желаемый результат заключается в том, что я хочу, чтобы приложение переместилось на карту, показывая местоположение пользователей,но вместо этого я получаю эту ошибку.

Необработанное исключение: запрошена операция навигатора с контекстом, который не включает навигатор.

...