Приложение Firebase Voting позволяет пользователям голосовать только один раз в android студии - PullRequest
0 голосов
/ 30 мая 2020

В приведенном ниже коде я пытаюсь заставить пользователей голосовать только один раз в моем приложении для голосования.

В настоящий момент пользователи могут голосовать более одного раза. Я создал поле hasVoted (карта с UID пользователей и true как значение, указывающее, что пользователь проголосовал) в элементе, за который голосуют, как показано в моем бэкэнде Firestore, однако это не работает так, как я хочу . Что могло быть не так. Кто-нибудь знает способ обойти это?

Пожалуйста, я новичок в трепетании и дротике, так что прошу прощения за мелкую ошибку, которую я совершаю при публикации этого вопроса

Ниже мой код

import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:compuvote/models/finance_model.dart';
import 'package:compuvote/routes/home_page.dart';
import 'package:compuvote/routes/transitionroute.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:charts_flutter/flutter.dart' as charts;

class FinanceResult extends StatefulWidget {
  @override
  _FinanceResultState createState() {
    return _FinanceResultState();
  }
}

class _FinanceResultState extends State<FinanceResult> {
  List<charts.Series<Record, String>> _seriesBarData;
  List<Record> mydata;
  _generateData(mydata) {
    _seriesBarData = List<charts.Series<Record, String>>();
    _seriesBarData.add(
      charts.Series(
        domainFn: (Record record, _) => record.name.toString(),
        measureFn: (Record record, _) => record.totalVotes,
        //colorFn: (Record record, _) => record.color,
        id: 'Record',
        data: mydata,
        // Set a label accessor to control the text of the arc label.
        labelAccessorFn: (Record row, _) => '${row.name}: ${row.totalVotes}',
        colorFn: (_, __) => charts.MaterialPalette.cyan.shadeDefault,
        fillColorFn: (_, __) => charts.MaterialPalette.transparent,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Finance Result'),
          leading: IconButton(
            icon: Icon(Icons.home),
            onPressed: () {
              Navigator.push(context, TransitionPageRoute(widget: HomePage()));
            },
          ),
        ),
        body: Container(
          color: Colors.grey.shade100,
          child: _buildBody(context),
        ));
  }

  /// ****** This code is suppose to build the body ***********/

  Widget _buildBody(BuildContext context) {
    return Column(
      children: <Widget>[
        StreamBuilder<QuerySnapshot>(
          stream: Firestore.instance.collection('finance').snapshots(),
          builder: (context, snapshot) {
            if (!snapshot.hasData) {
              return Center(
                child: LinearProgressIndicator(
                  valueColor: AlwaysStoppedAnimation(
                    Theme.of(context).primaryColor,
                  ),
                ),
              );
            } else {
              List<Record> finance = snapshot.data.documents
                  .map((documentSnapshot) =>
                      Record.fromMap(documentSnapshot.data))
                  .toList();
              return _buildChart(context, finance);
            }
          },
        ),
      ],
    );
  }

  Widget _buildChart(BuildContext context, List<Record> recorddata) {
    mydata = recorddata;
    _generateData(mydata);
    return Padding(
      padding: EdgeInsets.all(8.0),
      child: Container(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.height / 1.2,
        child: Center(
          child: Column(
            children: <Widget>[

              SizedBox(
                height: 10.0,
              ),
              Expanded(
                child: charts.PieChart(
                  _seriesBarData,
                  animate: true,
                  animationDuration: Duration(seconds: 3),
                  //For adding labels to the chart
                  defaultRenderer: new charts.ArcRendererConfig(
                      strokeWidthPx: 2.0,
                      arcWidth: 100,
                      arcRendererDecorators: [
                        // <-- add this to the code
                        charts.ArcLabelDecorator(
                          labelPosition: charts.ArcLabelPosition.auto,
                          labelPadding: 3,
                          showLeaderLines: true,
                          insideLabelStyleSpec: charts.TextStyleSpec(
                            color: charts.Color.white,
                            fontSize: 12,
                          ),
                          outsideLabelStyleSpec: charts.TextStyleSpec(
                            color: charts.Color.black,
                            fontSize: 12,
                          ),
                        ),
                      ]),

                ),
              ),
              Container(
                width: MediaQuery.of(context).size.width / 3.5,
                height: 1,
                color: Colors.black38,
              ),
              Expanded(
                child: Scaffold(
                  backgroundColor: Colors.grey.shade100,
                  body: _castVote(context),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  /// ****** This code is suppose to link to the Firestore collection ***********/

  Widget _castVote(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('finance').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData)
          return Center(
            child: LinearProgressIndicator(
              valueColor: AlwaysStoppedAnimation(
                Theme.of(context).primaryColor,
              ),
            ),
          );

        return _buildList(context, snapshot.data.documents);
      },
    );
  }

  /// ****** This code is suppose to build the List ***********/

  Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
    return ListView(
      padding: const EdgeInsets.only(top: 20.0),
      // ignore: missing_return

      children: snapshot.map((data) => _buildListItem(context, data)).toList(),
    );
  }

  /// ****** This code is suppose to build the List Items ***********/

  Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
    final record = Record.fromSnapshot(data);

    return Padding(
      key: ValueKey(record.name),
      padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
      child: Card(
        elevation: 2,
        child: Container(
          decoration: BoxDecoration(
            border: Border.all(color: Colors.grey.shade100),
            borderRadius: BorderRadius.circular(5.0),
          ),
          child: ListTile(
              title: Text(record.name),
              trailing: Text(record.totalVotes.toString()),
              onTap: () => {
                    _checkHasVoted(context, data),
                  }
              //onTap: () => {record.reference.updateData({'votes': record.votes + 1}),
              ),
        ),
      ),
    );
  }

  /// ****** This code is suppose to force users to vote only once ***********/

  Widget _checkHasVoted(BuildContext context, DocumentSnapshot data) {
    final record = Record.fromSnapshot(data);

    StreamSubscription<DocumentSnapshot> subscription;
    final DocumentReference documentReference =
        Firestore.instance.collection("finance").document() as DocumentReference;

    @override
    void initState() {
      super.initState();
      subscription = documentReference.snapshots().listen((datasnapshot) {
        if ((datasnapshot.data
            .containsKey(FirebaseAuth.instance.currentUser()))) {
          setState(() {
            return Text("Sorry you have voted in this category already");
          });
        }
        else if (!datasnapshot.data.containsKey(FirebaseAuth.instance.currentUser())){
          setState(() {
            record.reference.updateData({'votes':record.totalVotes + 1});
          });
        }
      });
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...