Как я могу удалить товар из списка покупок в Firebase Flutter? - PullRequest
0 голосов
/ 14 апреля 2020

Не могу решить, и даже попытался сделать это с логическим утверждением. Я не знаю, как получить к нему правильный способ удалить элемент. Вот что выводит: Неправильное использование ParentDataWidget. Если есть кто-то, кто был в такой же ситуации, пожалуйста, помогите. Я не знаю, как изменить приложение, чтобы оно работало.

    import 'package:list/screens/add_new_item_screen.dart';
    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';

    final _firestore = Firestore.instance;
    FirebaseUser loggedinUser;
    var idtodelete;

    FirebaseAuth _auth = FirebaseAuth.instance;

    class MainPage extends StatefulWidget {
      @override
      _MainPageState createState() => _MainPageState();
    }

    class _MainPageState extends State<MainPage> {
      void initState() {
    super.initState();
    getCurrentUser();
      }

      void getCurrentUser() async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedinUser = user;
        // print(loggedinUser.email);
      }
    } catch (e) {
      print(e);
    }
      }

      @override
      Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
              context, MaterialPageRoute(builder: (context) =>         Addnewitem()));
        },
        child: Icon(Icons.add),
      ),
      appBar: AppBar(
        leading: Container(),
        title: Text("Shopping List"),
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.close),
              onPressed: () {
                // messagesStream();
                _auth.signOut();
                Navigator.pop(context);
              })
        ],
      ),
      body: SafeArea(child: MessagesStream()),
    );
      }
    }

    class MessagesStream extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
    final currentUser = loggedinUser.email;
    return StreamBuilder<QuerySnapshot>(
        stream: _firestore
            .collection('users')
            .document(loggedinUser.uid)
            .collection('items')
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return (Center(
                child: CircularProgressIndicator(
                    backgroundColor: Colors.lightBlueAccent)));
          }
          final items = snapshot.data.documents.reversed;
          List<MessageBubble> messageBubbles = [];
          for (var message in items) {
            final item = message.data['item'];
            final messageSender = message.data['email'];
            final quant = message.data['quant'];
            final id = message.data['id'];
            final boli = message.data['bool'];

            // final currentUser = loggedinUser.email;

            final messageBubble = MessageBubble(
              text: item,
              quant: quant,
            );

            boli?messageBubbles.add(messageBubble):null;
          }
          return Expanded(
            child: ListView(
              // reverse: true,
              padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
              children: messageBubbles,
            ),
          );
        });
      }
    }

    class MessageBubble extends StatelessWidget {
      MessageBubble({this.text, this.quant});

      final String text;
      final String quant;

      @override
      Widget build(BuildContext context) {
        return Expanded(
      flex: 1,
          child: Padding(
        padding: EdgeInsets.all(2.0),
        child: Column(

          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Container(
              color: Colors.tealAccent,
              child: FlatButton(
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Text(
                        text,
                        style: TextStyle(color: Colors.black, fontSize: 20),
                      ),
                      Text(quant,
                          style: TextStyle(color: Colors.black, fontSize: 20))
                    ],
                  ),
                  onPressed: () {
                     DeleteItem(text).onPressed();
                  }),
            )
          ],
        ),
      ),
        );
      }
    }

    class DeleteItem {
      DeleteItem(this.text);
      var text;

      void onPressed() async {
        await for (var snapshot in _firestore
        .collection('users')
        .document(loggedinUser.uid)
        .collection('items')
        .where('item', isEqualTo: text)
        .snapshots()) {
      for (var items in snapshot.documents) {
        final idtodelete = items.data['id'];
        final itemdelete = items.data['item'];
        final quantdelete = items.data['quant'];
        final boli = items.data['bool'];
        final emaildelete = items.data['email'];


        print(idtodelete);

      }


    }

    return _firestore
        .collection('users')
        .document(loggedinUser.uid)
        .collection('items')
        .document(idtodelete)
        .updateData({'bool': false});
      }
      }

      // Future<void> delete() async{
      //   return await _firestore
      //       .collection('users')
      //       .document(loggedinUser.uid)
      //       .collection('items')
      //       .document(idtodelete)
      //       .updateData({'bool': false});
      // }```


     ```flutter doctor
    Doctor summary (to see all details, run flutter doctor -v):
    [✓] Flutter (Channel master, v1.18.0-5.0.pre.94, on Mac OS X 10.15.4   19E287,
    locale en-DE)

    [✓] Android toolchain - develop for Android devices (Android SDK version    29.0.3)
    [✓] Xcode - develop for iOS and macOS (Xcode 11.4)
    [✓] Chrome - develop for the web
    [✓] Android Studio (version 3.5)
    [✓] VS Code (version 1.44.0)
    [✓] Connected device (3 available)

    • No issues found!```


      '''class MessagesStream extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
    final currentUser = loggedinUser.email;
    if (currentUser == null) {
      return (Center(
                child: CircularProgressIndicator(
                    backgroundColor: Colors.lightBlueAccent)));
    }
    return StreamBuilder<QuerySnapshot>(

        stream: _firestore
            .collection('users')
            .document(loggedinUser.uid)
            .collection('items')
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData || snapshot.hasError || snapshot.data == null || snapshot.connectionState == ConnectionState.waiting || loggedinUser.email == null) {

            return (Center(
                child: CircularProgressIndicator(
                    backgroundColor: Colors.lightBlueAccent)));
          }
          final items = snapshot.data.documents.reversed;
          List<MessageBubble> messageBubbles = [];
          for (var message in items) {
            final item = message.data['item'];

            final quant = message.data['quant'];
            final id = message.data['id'];
            final boli = message.data['bool'];

            // final currentUser = loggedinUser.email;

            final messageBubble = MessageBubble(
              text: item,
              quant: quant,
              documentReference: message.reference,
            );

            messageBubbles.add(messageBubble);
          }
          return Expanded(
            child: ListView(
              // reverse: true,
              padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
              children: messageBubbles,
            ),
          );
        });
       }
       }'''







    New code:
        """import 'package:flutter/material.dart';
           import 'package:list/screens/add_new_item_screen.dart';
           import 'package:firebase_auth/firebase_auth.dart';
           import 'package:cloud_firestore/cloud_firestore.dart';

             final _firestore = Firestore.instance;
             FirebaseUser loggedinUser;

             Future<void> _fetchdata;


FirebaseAuth _auth = FirebaseAuth.instance;

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  void initState() {
    super.initState();

    _fetchdata = getCurrentUser();
  }

  Future<void> getCurrentUser() async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedinUser = user;
        // print(loggedinUser.email);
      }
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
              context, MaterialPageRoute(
                builder: (context) => Addnewitem()));
        },
        child: Icon(Icons.add),
      ),
      appBar: AppBar(
        leading: Container(),
        title: Text("Shopping List"),
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.close),
              onPressed: () {
                // messagesStream();
                _auth.signOut();
                Navigator.pop(context);
              })
        ],
      ),
      body: SafeArea(child: 

          MessagesStream(),


      ),
    );
  }
}

class MessagesStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    FutureBuilder(
      future: _fetchdata,
      builder: (context, myFuture){
        if (myFuture.connectionState == ConnectionState.done && !myFuture.hasError) {

            return StreamBuilder<QuerySnapshot>(

        stream: _firestore
            .collection('users')
            .document(loggedinUser.uid)
            .collection('items')
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData || snapshot.hasError || snapshot.data == null || snapshot.connectionState == ConnectionState.waiting || loggedinUser.email == null) {

            return (Center(
                child: CircularProgressIndicator(
                    backgroundColor: Colors.lightBlueAccent)));
          }
          final items = snapshot.data.documents.reversed;
          List<MessageBubble> messageBubbles = [];
          for (var message in items) {
            final item = message.data['item'];

            final quant = message.data['quant'];
            final id = message.data['id'];
            final boli = message.data['bool'];

            // final currentUser = loggedinUser.email;

            final messageBubble = MessageBubble(
              text: item,
              quant: quant,
              documentReference: message.reference,
            );
            try {
            messageBubbles.add(messageBubble);}
            catch (e) {
              print(e);
            }
          }
          try {
          return Expanded(
            child: ListView(
              // reverse: true,
              padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
              children: messageBubbles,
            ),
          );
        } catch (e) {
          return Container();
          }
        });


        } else {
          return CircularProgressIndicator();
        }
      });
  }
}

class MessageBubble extends StatelessWidget {
  MessageBubble({this.text, this.quant, this.documentReference});

  final String text;
  final String quant;
  final DocumentReference documentReference;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Expanded(
        flex: 1,
            child: Column(

              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                Container(
                  color: Colors.tealAccent,
                  child: FlatButton(
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: <Widget>[
                          Text(
                            text,
                            style: TextStyle(color: Colors.black, fontSize: 20),
                          ),
                          Text(quant,
                              style: TextStyle(color: Colors.black, fontSize: 20))
                        ],
                      ),
                      onPressed: () {
                         documentReference.delete();
                      }),
                )
              ],
            ),
      ),
    );
  }
}"""







1 Ответ

1 голос
/ 14 апреля 2020

Я бы добавил переменную DocumentReference в конструктор MessageBubble:

MessageBubble({this.text, this.quant, this.documentReference});

final String text;
final String quant;
final DocumentReference documentReference;

и передал бы DocumentReference из message типа DocumentSnapshot в элемент List:

final messageBubble = MessageBubble(
    text: item,
    quant: quant,
    documentReference: message.reference,
);

Теперь вы можете удалить DocumentSnapshot, открыв его DocumentReference и вызвав для него функцию delete.

onPressed: () {
    documentReference.delete();
}),

Таким образом, вы также сохраняете дополнительный документ читает


редактировать после комментариев:

Если у вас есть виджет, который зависит от значения Future, вы должны обернуть его FutureBuilder .

Future<void> _fetchData;

Объявите переменную Future типа void и присвойте ее в initState вашей функции, которая ожидает данные Future, например, Future будет получен только в первая State текущей страницы.

@override
void initState(){
    super.initState();
    _fetchData = getCurrentUser();
}

Также измените тип возврата getCurrentUser с void на Future<void>. Теперь оберните ваш StreamBuilder FutureBuilder и присвойте будущему свойству _fetchData и верните StreamBuilder, если выполняются следующие условия:

FutureBuilder(
    future: _fetchData,
    builder: (context, myFuture){
        if(myFuture.connectionState==ConnectionState.done && !myFuture.hasError){
            return StreamBuilder(...); // as before and with conditions mentioned in comments
        }else{
            return CircularProgressIndicator();
        },
),

Обратите внимание, что myFuture.hasData будет false здесь, потому что это Future<void>, и мы не возвращаем данные напрямую, если бы это было, например, Будущее, мы бы также проверили на hasData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...