Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在flatter onchangedlocation.listen上更改int interval设置_Flutter_Dart - Fatal编程技术网

Flutter 如何在flatter onchangedlocation.listen上更改int interval设置

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

我正在将我的位置流到firestore,但我希望它以较慢的速率发送。目前它似乎每5000毫秒更新一次,但我不知道如何将其更改为50000毫秒。如何修改代码,使其更改位置的流传输速率?完整的github项目。谢谢你的阅读

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我更新了我的答案,请查看。也许会帮助你谢谢这段代码让我走上了正确的方向,非常感谢。