Как получить данные шагомера (stepcountvalue) на основе автозапуска из firestore

#firebase #flutter #dart #google-cloud-firestore #auto-update

#firebase #флаттер #dart #google-облако-firestore #автоматическое обновление

Вопрос:

Я хочу получить значение StepCountValue из firestore и отобразить его в своем приложении в режиме реального времени. База данных с функцией автоматического обновления в реальном времени означает, что мне нужен метод обновления в реальном времени / без него.Итак, если пользователь проходит некоторое расстояние, он / она получает свои общие шаги ходьбы в приложении.

Как извлечь данные из базы данных и поместить их в контейнер (page.dart)

Как получить данные шагомера (stepcountvalue), автоматически изменяющие данные при автозапуске и извлекаемые с помощью firestore

Как автоматически обновить эти данные в firestore введите описание изображения здесь

Это мой main.dart

 import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_testing/models/brew.dart';
import 'package:flutter_testing/models/user.dart';
import 'package:flutter_testing/screens/Pages/page.dart';
import 'package:flutter_testing/screens/wrapper.dart';
import 'package:flutter_testing/services/auth.dart';
import 'package:flutter_testing/services/database.dart';
import 'dart:async';
import 'package:percent_indicator/circular_percent_indicator.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:pedometer/pedometer.dart';
import 'package:provider/provider.dart';

void main() => runApp(new NewApp());

class NewApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<User>.value(
      value: AuthService().user,
      child: MaterialApp(
        home: Wrapper(),
      ),
    );
  }
}



class MyApp extends StatefulWidget {

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  final AuthService _auth = AuthService();

  String muestrePasos = "";
  String _km = "Unknown";
  String _calories = "Unknown";
  String stepCountValue = 'Unknown';
  String _showcoin = '0';

  StreamSubscription<int> _subscription;

  double _numerox; //numero pasos
  double _convert;
  double _kmx;
  double burnedx;
  double _coin;
  double _porciento;
  // double percent=0.1;

  @override
  void initState() {
    super.initState();
    //initPlatformState();
    setUpPedometer();
  }

  //inicia codigo pedometer
  void setUpPedometer() {
    Pedometer pedometer = new Pedometer();
    _subscription = pedometer.stepCountStream.listen(_onData,
        onError: _onError, onDone: _onDone, cancelOnError: true);
  }

  void _onData(int stepCountValue1) async {
    // print(stepCountValue); //impresion numero pasos por consola
    setState(() {
      stepCountValue = "$stepCountValue1";
      // print(stepCountValue);
    });

    var dist = stepCountValue1; //pasamos el entero a una variable llamada dist
    double y = (dist   .0); //lo convertimos a double una forma de varias

    setState(() {
      _numerox = y; //lo pasamos a un estado para ser capturado ya convertido a double
    });

    var long3 = (_numerox);
    long3 = num.parse(y.toStringAsFixed(2));
    var long4 = (long3 / 10000);

    int decimals = 1;
    int fac = pow(10, decimals);
    double d = long4;
    d = (d * fac).round() / fac;
    print("d: $d");

    getDistanceRun(_numerox);

    setState(() {
      _convert = d;
      print(_convert);
    });
  }

  void reset() {
    setState(() {
      int stepCountValue1 = 0;
      stepCountValue1 = 0;
      stepCountValue = "$stepCountValue1";
    });
  }

  void _onDone() {}

  void _onError(error) {
    print("Flutter Pedometer Error: $error");
  }

  //function to determine the distance run in kilometers using number of steps
  void getDistanceRun(double _numerox) {
    var distance = ((_numerox * 76) / 100000);
    distance = num.parse(distance.toStringAsFixed(2)); //dos decimales
    var distancekmx = distance * 34;
    distancekmx = num.parse(distancekmx.toStringAsFixed(2));
    //print(distance.runtimeType);
    var coiny = ((_numerox * 125) / 100000);
    coiny = num.parse(coiny.toStringAsFixed(2));

    setState(() {
      _km = "$distance";
      //print(_km);
    });
    setState(() {
      _kmx = num.parse(distancekmx.toStringAsFixed(2));
    });

    setState(() {
      _coin = num.parse(coiny.toStringAsFixed(2));
      //print(_coiny);
    });
  }

  //function to determine the calories burned in kilometers using number of steps
  void getBurnedRun() {
    setState(() {
      var calories = _kmx; //dos decimales
      _calories = "$calories";
      //print(_calories);
    });
  }

  void coins() {
    setState(() {
      var showcoin = _coin;
      _showcoin = "$showcoin";
    });
  }

  //fin codigo pedometer

  @override
  Widget build(BuildContext context) {
    //print(_stepCountValue);
    getBurnedRun();
    coins();
    return StreamProvider<QuerySnapshot>.value(
        value: DatabaseService().step,
        child: MaterialApp(
          debugShowCheckedModeBanner: false,
          home: new Scaffold(
            appBar: new AppBar(
              title: const Text('Step Counter'),
              backgroundColor: Colors.black54,
              actions: <Widget>[
                FlatButton.icon(
                    icon: Icon(Icons.person),
                    label: Text('logout'),
                    onPressed: () async {
                      await _auth.signOut();
                    }
                ),
          FlatButton.icon(
            icon: Icon(Icons.arrow_back),
            label: Text('New Page'),
            onPressed: () {
              Navigator.of(context)
                  .push(MaterialPageRoute(builder: (context) => pages()));
            }
          ),
          ],
          ),

            body: new ListView(
              padding: EdgeInsets.all(5.0),
              children: <Widget>[
                Container(
                  padding: EdgeInsets.only(top: 10.0),
                  width: 250,
                  //ancho
                  height: 250,
                  //largo tambien por numero height: 300
                  decoration: BoxDecoration(
                      gradient: LinearGradient(
                        begin: Alignment
                            .bottomCenter, //cambia la iluminacion del degradado
                        end: Alignment.topCenter,
                        colors: [Color(0xFFA9F5F2), Color(0xFF01DFD7)],
                      ),
                      borderRadius: BorderRadius.only(
                        bottomLeft: Radius.circular(27.0),
                        bottomRight: Radius.circular(27.0),
                        topLeft: Radius.circular(27.0),
                        topRight: Radius.circular(27.0),
                      )),
                  child: new CircularPercentIndicator(
                    radius: 200.0,
                    lineWidth: 13.0,
                    animation: true,
                    center: Container(
                      child: new Row(
                        crossAxisAlignment: CrossAxisAlignment.center,
                        children: <Widget>[
                          Container(
                            height: 50,
                            width: 50,
                            padding: EdgeInsets.only(left: 20.0),
                            child: Icon(
                              FontAwesomeIcons.walking,
                              size: 30.0,
                              color: Colors.white,
                            ),
                          ),
                          Container(
                            //color: Colors.orange,
                            child: Text(
                              '$stepCountValue',
                              style: TextStyle(
                                  fontWeight: FontWeight.bold,
                                  fontSize: 20.0,
                                  color: Colors.purpleAccent),
                            ),
                            // height: 50.0,
                            // width: 50.0,
                          ),
                        ],
                      ),
                    ),
                    percent: 0.217,
                    //percent: _convert,
                    footer: new Text(
                      "Steps:  $stepCountValue",
                      style: new TextStyle(
                          fontWeight: FontWeight.bold,
                          fontSize: 12.0,
                          color: Colors.purple),
                    ),
                    circularStrokeCap: CircularStrokeCap.round,
                    progressColor: Colors.purpleAccent,
                  ),
                ),
                Divider(
                  height: 5.0,
                ),
                Container(
                  width: 80,
                  height: 100,
                  padding: EdgeInsets.only(left: 25.0, top: 10.0, bottom: 10.0),
                  color: Colors.transparent,
                  child: Row(
                    children: <Widget>[
                      new Container(
                        child: new Card(
                          child: Container(
                            height: 80.0,
                            width: 80.0,
                            decoration: BoxDecoration(
                              image: DecorationImage(
                                image: AssetImage("assets/images/distance.png"),
                                fit: BoxFit.fitWidth,
                                alignment: Alignment.topCenter,
                              ),
                            ),
                            child: Text(
                              "$_km Km",
                              textAlign: TextAlign.right,
                              style: new TextStyle(
                                  fontWeight: FontWeight.bold, fontSize: 14.0),
                            ),
                          ),
                          color: Colors.white54,
                        ),
                      ),
                      VerticalDivider(
                        width: 20.0,
                      ),
                      new Container(
                        child: new Card(
                          child: Container(
                            height: 80.0,
                            width: 80.0,
                            decoration: BoxDecoration(
                              image: DecorationImage(
                                image: AssetImage("assets/images/burned.png"),
                                fit: BoxFit.fitWidth,
                                alignment: Alignment.topCenter,
                              ),
                            ),
                          ),
                          color: Colors.transparent,
                        ),
                      ),
                      VerticalDivider(
                        width: 20.0,
                      ),
                      new Container(
                        child: new Card(
                          child: Container(
                            height: 80.0,
                            width: 80.0,
                            decoration: BoxDecoration(
                              image: DecorationImage(
                                image: AssetImage("assets/images/step.png"),
                                fit: BoxFit.fitWidth,
                                alignment: Alignment.topCenter,
                              ),
                            ),
                          ),
                          color: Colors.transparent,
                        ),
                      ),
                    ],
                  ),
                ),
                Divider(
                  height: 2,
                ),
                Container(
                  padding: EdgeInsets.only(top: 2.0),
                  width: 150,
                  //ancho
                  height: 30,
                  //largo tambien por numero height: 300
                  color: Colors.transparent,
                  child: Row(
                    children: <Widget>[
                      new Container(
                        padding: EdgeInsets.only(left: 40.0),
                        child: new Card(
                          child: Container(
                            child: Text(
                              "$_km Km",
                              textAlign: TextAlign.right,
                              style: new TextStyle(
                                  fontWeight: FontWeight.bold,
                                  fontSize: 14.0,
                                  color: Colors.white),
                            ),
                          ),
                          color: Colors.purple,
                        ),
                      ),
                      VerticalDivider(
                        width: 20.0,
                      ),
                      new Container(
                        padding: EdgeInsets.only(left: 10.0),
                        child: new Card(
                          child: Container(
                            child: Text(
                              "$_calories kCal",
                              textAlign: TextAlign.right,
                              style: new TextStyle(
                                  fontWeight: FontWeight.bold,
                                  fontSize: 14.0,
                                  color: Colors.white),
                            ),
                          ),
                          color: Colors.red,
                        ),
                      ),
                      VerticalDivider(
                        width: 5.0,
                      ),
                      new Container(
                        padding: EdgeInsets.only(left: 10.0),
                        child: new Card(
                          child: Container(
                            child: Text(
                              "$_showcoin Coins",
                              textAlign: TextAlign.right,
                              style: new TextStyle(
                                  fontWeight: FontWeight.bold,
                                  fontSize: 14.0,
                                  color: Colors.white),
                            ),
                          ),
                          color: Colors.black,
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
    );
  }
}
  

это моя оболочка.dart

 import 'package:flutter_testing/models/user.dart';
import 'package:flutter_testing/screens/authenticate/authenticate.dart';
import 'package:flutter/material.dart';
import 'package:flutter_testing/main.dart';
import 'package:provider/provider.dart';

class Wrapper extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    final user = Provider.of<User>(context);

    // return either the Home or Authenticate widget
    if (user == null){
      return Authenticate();
    } else {
      return MyApp();
    }

  }
}
  

это page.dart

 import 'package:flutter/material.dart';
import 'package:flutter_testing/main.dart';

class pages extends StatefulWidget {
  @override
  _pagesState createState() => _pagesState();
}

class _pagesState extends State<pages> {
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      backgroundColor: Colors.amber,
        appBar: new AppBar(
          actions: <Widget>[
            FlatButton.icon(
              icon: Icon(Icons.arrow_back_ios),
              label: Text('back'), onPressed: () {
                Navigator.of(context)
                    .push(MaterialPageRoute(builder: (context) => MyApp())
                );
            }
            ),
          ],
        ),
      body: Container(),
    );
  }
}
  

это database.dart

 import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter_testing/models/brew.dart';

class DatabaseService {

  final String uid;
  DatabaseService({ this.uid });

  // collection reference
  final CollectionReference brewCollection = Firestore.instance.collection('step');
  Future<void> updateUserData(int stepCountValue, int _calories, int _km , int _showcoin) async {
    return await brewCollection.document(uid).setData({
      'stepCountValue': stepCountValue,
      '_calories': _calories,
      '_km': _km,
      '_showcoin': _showcoin,
    });

      // get brews stream
  Stream<QuerySnapshot> get step {
    return brewCollection.snapshots();
  }


}
  

это brew.dart

 class Brew {

  final int stepCountValue;

  Brew({ this.stepCountValue });

}
  

Надеюсь, этого достаточно, чтобы решить мою проблему. Я очень новичок в Flutter, и я мало что знаю о firebase и firestore, поэтому было бы неплохо, если бы вы могли сказать, где ИМЕННО я должен ЧТО-то изменить или добавить. Большое вам спасибо!!!

Комментарии:

1. Пожалуйста, отредактируйте вопрос, чтобы более подробно описать, что работает не так, как вы ожидаете. Здесь много кода, и вы должны сузить проблему до проблемных строк.

2. можете ли вы мне сейчас помочь

3. вы создали это приложение?

Ответ №1:

Вы можете написать запрос в функции _onData() вашего файла main.dart, это автоматически обновит данные всякий раз, когда будут какие-либо изменения в ваших шагах. И вы можете легко получать данные в режиме реального времени с помощью StreamBuilder.

например:

 void _onData(int stepCountValue1) async {
// print(stepCountValue); //impresion numero pasos por consola
setState(() {
  stepCountValue = "$stepCountValue1";
});
final CollectionReference brewCollection = Firestore.instance.collection('step');
await brewCollection.document(uid).setData({
  'stepCountValue': stepCountValue,
});
}