shivam
shivam

Reputation: 13

How to set text values to change automatically in flutter?

I'm new to flutter and developing an app in which vehicle speed is shown in the floating action button in Scaffold. But I want it to change according to speed automatically so that it doesn't need to refresh/restart manually every time.

Here's my code.

import 'dart:async';

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


class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

double speedInMps;
double speedInKph;
var geolocator = Geolocator();
var locationOptions = LocationOptions(accuracy: LocationAccuracy.high, 
distanceFilter: 10);

Future<void> getVehicleSpeed()async{

try{
  geolocator.getPositionStream((locationOptions)).listen((position) async 
{
     speedInMps = await position.speed;
     speedInKph = speedInMps * 1.609344;

     print(speedInKph.round());

  });
}catch(e){
  print(e);
}
}

@override
Widget build(BuildContext context) {

return MaterialApp(
    home: Scaffold(  floatingActionButton: FloatingActionButton(
    onPressed: () {getVehicleSpeed();
},
child: Text(speedInKph.round().toString() +'Km/h'),//Need Improvments 
Here
backgroundColor: Colors.green,
    ),
      appBar: AppBar(
        title: Text('speed'),
        centerTitle: true,
      ),

      body: Center(
        child: FlatButton(
          onPressed: getVehicleSpeed,
          child: Text(
        speedInKph.toString(),
            style: TextStyle(fontSize: 16.0),
          ),
          color: Color(0xffdd4b39),
          textColor: Colors.white,
          padding: const EdgeInsets.all(20.0),
        ),

      ),

    )
 );
}
}

I have to hot reload/restart to get updated speed, but I want it to refresh speed automatically.

Upvotes: 0

Views: 1588

Answers (1)

Abhay Koradiya
Abhay Koradiya

Reputation: 2117

You need to listen location only once. So put in initState which called when widget is initialized.

@override
void initState() {
  super.initState();
  getVehicleSpeed();
}

And than call setState method when data is change. It will rebuild the widget.

Future<void> getVehicleSpeed() async {
    try {
      geolocator.getPositionStream((locationOptions)).listen((position) async {
      speedInMps = position.speed;
      setState(() {
        speedInKph = speedInMps * 1.609344;
      });

      print(speedInKph.round());
    });
  } catch (e) {
    print(e);
  }
}

Upvotes: 1

Related Questions