Flutter 如何在flatter onchangedlocation.listen上更改int interval设置
我正在将我的位置流到firestore,但我希望它以较慢的速率发送。目前它似乎每5000毫秒更新一次,但我不知道如何将其更改为50000毫秒。如何修改代码,使其更改位置的流传输速率?完整的github项目。谢谢你的阅读Flutter 如何在flatter onchangedlocation.listen上更改int interval设置,flutter,dart,Flutter,Dart,我正在将我的位置流到firestore,但我希望它以较慢的速率发送。目前它似乎每5000毫秒更新一次,但我不知道如何将其更改为50000毫秒。如何修改代码,使其更改位置的流传输速率?完整的github项目。谢谢你的阅读 import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'packa
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:location/location.dart';
import 'package:tracker/widget/enable_in_background.dart';
class AddLocation extends StatefulWidget {
final double lat;
final double lng;
final double speed;
AddLocation({Key key, this.lat, this.lng, this.speed}) : super(key: key);
@override
_AddLocationState createState() => _AddLocationState();
}
class _AddLocationState extends State<AddLocation> {
// Field
double lat, lng;
double speed;
String dateString;
// Method
initState(){ Location location = new Location();
location.onLocationChanged.listen((res) {
setState(() {
lat = res.latitude;
lng = res.longitude;
});
insertDataToFirestore();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: <Widget>[
Container(
margin: const EdgeInsets.only(right: 42),
child: RaisedButton(
child: const Text('Post User Location'),
onPressed: insertDataToFirestore,
),
),
EnableInBackgroundWidget()
],
),
),
);
}
Future<Stream<Null>> insertDataToFirestore() async {
FirebaseAuth auth = FirebaseAuth.instance;
FirebaseUser firebaseUser = await auth.currentUser();
String email = firebaseUser.email;
String uid = firebaseUser.uid;
String displayName = firebaseUser.displayName;
DateTime dateTime = DateTime.now();
String dateString = DateFormat('dd-MM-yyyy - kk:mm').format(dateTime);
Map<String, dynamic> map = Map();
map['DateTime'] = dateString;
map['Lat'] = lat;
map['Lng'] = lng;
map['Speed'] = speed;
map['Email'] = email;
map['Uid'] = uid;
map['DisplayName'] = displayName;
Firestore firestore = Firestore.instance;
CollectionReference collectionReference =
firestore.collection('locations');
await collectionReference.document().setData(map).then((value) {
print('Upload Success');
});
}
}
导入'dart:async';
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“包:intl/intl.dart”;
导入“package:location/location.dart”;
导入“package:tracker/widget/enable_in_background.dart”;
类AddLocation扩展了StatefulWidget{
最终双lat;
最终双液化天然气;
最终双速;
AddLocation({Key-Key,this.lat,this.lng,this.speed}):super(Key:Key);
@凌驾
_AddLocationState createState();
}
类_AddLocationState扩展状态{
//场
双lat,液化天然气;
双速;
字符串日期字符串;
//方法
initState(){Location Location=new Location();
location.onLocationChanged.listen((res){
设置状态(){
纬度=相对纬度;
lng=经度;
});
insertDataToFirestore();
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:SingleChildScrollView(
子:列(
儿童:[
容器(
边距:仅限常量边集(右:42),
孩子:升起按钮(
子项:const Text('Post User Location'),
onPressed:insertDataToFirestore,
),
),
EnableInBackgroundWidget()
],
),
),
);
}
Future insertDataToFirestore()异步{
FirebaseAuth auth=FirebaseAuth.instance;
FirebaseUser FirebaseUser=wait auth.currentUser();
字符串email=firebaseUser.email;
字符串uid=firebaseUser.uid;
字符串displayName=firebaseUser.displayName;
DateTime DateTime=DateTime.now();
字符串dateString=DateFormat('dd-MM-yyyy-kk:MM')。格式(dateTime);
Map=Map();
映射['DateTime']=dateString;
地图['Lat']=Lat;
map['Lng']=Lng;
地图['Speed']=速度;
map['Email']=电子邮件;
映射['Uid']=Uid;
映射['DisplayName']=DisplayName;
Firestore Firestore=Firestore.instance;
CollectionReference CollectionReference=
firestore.集合(“位置”);
等待collectionReference.document().setData(映射)。然后((值){
打印(“上传成功”);
});
}
}
您可以使用workmanager和future,而不是使用stream
此软件包设置一个间隔,您可以使用future更新此间隔上的firebase条目
让你的主要方法是这样的
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Workmanager.initialize(
callbackDispatcher,
isInDebugMode: false,
);
await Workmanager.registerPeriodicTask(
"5", "simplePeriodicTask",
existingWorkPolicy: ExistingWorkPolicy.replace,
initialDelay: Duration(seconds: 5),
constraints: Constraints(
networkType: NetworkType.connected,
),
frequency: Duration(minutes: 30), // 30 min interval(minimum 15 min)
);
runApp(myApp());
}
void callbackDispatcher() {
Workmanager.executeTask((task, inputData) async {
**do firebase update here**
return Future.value(true);
});
}
谢谢你的回复。这听起来是个不错的主意,你能提供一些代码示例吗?我不熟悉编程和flifter,所以学习速度很慢,我将继续阅读有关workmanager和futures的内容。@giroprotagonist我更新了我的答案,请查看。也许会帮助你谢谢这段代码让我走上了正确的方向,非常感谢。