Flutter 颤振-Futurebuilder在获得位置许可后继续返回null

Flutter 颤振-Futurebuilder在获得位置许可后继续返回null,flutter,Flutter,问题 Futurebuilder在用户授予访问其位置的权限后继续返回“null”,以便计算两个位置之间的距离 我希望它做什么 当页面刷新时,它确实给出了位置,但我想要的是当用户访问其位置时,而不是当用户刷新其页面时,两个对象之间的距离 运行应用程序的主代码 import 'package:flutter/material.dart'; import 'mainlist.dart'; void main() => runApp(MyApp()); class MyApp exten

问题

Futurebuilder在用户授予访问其位置的权限后继续返回“null”,以便计算两个位置之间的距离

我希望它做什么

当页面刷新时,它确实给出了位置,但我想要的是当用户访问其位置时,而不是当用户刷新其页面时,两个对象之间的距离

运行应用程序的主代码

import 'package:flutter/material.dart';
import 'mainlist.dart';




void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override

  Widget build(BuildContext context) {

    return new MaterialApp(
      routes: {
        '/second': (context) => mainlist()
      },
      title: "testapp",
      debugShowCheckedModeBanner: false,
      home: mainlist(),
    );
  }
}
出现问题的代码-Futurebuilder+getCurrenPosition Future

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

import 'package:async/async.dart';
import 'package:geolocator/geolocator.dart';
import 'package:permission/permission.dart';
import 'mainlist.dart';


class mainlist extends StatefulWidget {
  @override
  _mainlistpage createState() => _mainlistpage();
}


class _mainlistpage extends State<mainlist> {


  Future<String> getCurrentPosition(DocumentSnapshot document) async{
    Position position = await Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
    double distanceInMeters = await Geolocator().distanceBetween(position.latitude, position.longitude, document['lat'], document['lat']);
    return distanceInMeters.toString();
  }

  var sortBy = "";

  Widget homePage() {
    return StreamBuilder(
      stream: Firestore.instance.collection("Test").orderBy(sortBy).snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) return Text("Loading");
        return ListView.builder(
            itemCount: snapshot.data.documents.length,
            itemBuilder: (context, index) =>
                _mainListItem(context, snapshot.data.documents[index]));
      },
    );
  }


  @override
  Widget _mainListItem(BuildContext context, DocumentSnapshot document) {
    return Scaffold(
      body: Container(
        child: Center(
          child: Column(
              children: <Widget>[
                FutureBuilder(
                    future: getCurrentPosition(document),
                    builder: (BuildContext context,AsyncSnapshot snapshot)  {
                      switch (snapshot.connectionState) {
                        case ConnectionState.none:
                          return Text('none');
                        case ConnectionState.active:
                        case ConnectionState.waiting:
                          return Text('waiting');
                        case ConnectionState.done:
                          if (snapshot.hasError)
                            return Text('Error: ${snapshot.error}');
                          return Text(snapshot.data.toString());

                      }
                      return null; // unreachable
                    }
                ),
              ]
          ),
        ),
      ),
    );
  }

  Widget build(BuildContext context){
    return new Scaffold();
  }
}
import'包:cloud_firestore/cloud_firestore.dart';
进口“包装:颤振/材料.省道”;
导入“包:async/async.dart”;
导入“包:地理定位器/地理定位器.dart”;
导入“package:permission/permission.dart”;
导入“mainlist.dart”;
类mainlist扩展StatefulWidget{
@凌驾
_mainlistpage createState()=>\u mainlistpage();
}
类_mainlistpage扩展状态{
未来getCurrentPosition(文档快照文档)异步{
Position Position=Wait Geolocator().getCurrentPosition(期望精度:LocationAccurance.high);
double distanceInMeters=Wait Geolocator().distanceBetween(位置.纬度,位置.经度,文档['lat'],文档['lat']);
返回距离inmeters.toString();
}
var sortBy=“”;
Widget主页(){
返回流生成器(
流:Firestore.instance.collection(“Test”).orderBy(sortBy).snapshots(),
生成器:(上下文,快照){
如果(!snapshot.hasData)返回文本(“加载”);
返回ListView.builder(
itemCount:snapshot.data.documents.length,
itemBuilder:(上下文,索引)=>
_mainListItem(上下文、快照、数据、文档[索引]);
},
);
}
@凌驾
小部件_mainListItem(构建上下文上下文、文档快照文档){
返回脚手架(
主体:容器(
儿童:中心(
子:列(
儿童:[
未来建设者(
未来:getCurrentPosition(文档),
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
案例连接状态。无:
返回文本(“无”);
案例连接状态.active:
案例连接状态。正在等待:
返回文本(“等待”);
案例连接状态。完成:
if(snapshot.hasError)
返回文本('Error:${snapshot.Error}');
返回文本(snapshot.data.toString());
}
返回null;//不可访问
}
),
]
),
),
),
);
}
小部件构建(构建上下文){
返回新脚手架();
}
}
我试过什么

  • 使用streambuilder
  • 在Futurebuilder中处理案例
  • 读取堆栈溢出
  • 我已经在plist和manifest中添加了权限

您是否在清单和Info.plis上包含地理位置权限?@HaironChaviano是的,我包含了。我认为,因为“mainlist”是从应用程序的一开始就启动的,所以它立即想要构建“\u mainListItem”,而Futurebuilder在用户接受许可之前没有数据。但另一方面,Futurebuilder/Streambuilder应该在数据正确时重新加载吗?现在,它只在用户重新加载页面时加载数据。所以我想为位置权限创建一个单独的页面,但我真的想这样修复它。