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