首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振-如何使用模型从Firebase实时数据库中读取列表

颤振-如何使用模型从Firebase实时数据库中读取列表
EN

Stack Overflow用户
提问于 2019-09-20 00:11:07
回答 1查看 2.8K关注 0票数 2

[ ,为我糟糕的英语道歉] 在这个项目中,我从JSON的一些页面中查看事件列表,在CloudEvents页面中,我使用事件模型从Firebase数据库查看另一个列表. 现在,当我运行CloudEvents页面时,itemsEvent[i].startDate为null。 有此错误:A non-null String must be provided to a Text widget. 打开:错误快照 打开:防火墙数据库快照 我用这个方法做我的模型

这是我的事件模型

代码语言:javascript
复制
    class Event {
          String key;
          String sectionID;
          String sectionTitle;
          String title;
          String startDate;
          String endDate;
          String startDateAr;
          String endDateAr;
          String city;
          String detail;
          String location;
          String more;
          String link;

          // for generalevent.json
          String eventDate;
          String eventDateAr;

          Event(
              {this.sectionID,
              this.sectionTitle,
              this.title,
              this.startDate,
              this.endDate,
              this.startDateAr,
              this.endDateAr,
              this.city,
              this.detail,
              this.location,
              this.more,
              this.link,
              this.eventDate,
              this.eventDateAr});

          factory Event.fromJson(Map<String, dynamic> json) {
            return Event(
              sectionID: json['section-id'],
              sectionTitle: json['section-title'],
              title: json['title'],
              startDate: json['start-event-date'],
              endDate: json['end-event-date'],
              startDateAr: json['start-event-date-ar'],
              endDateAr: json['end-event-date-ar'],
              city: json['city'],
              detail: json['detail'],
              location: json['location'],
              more: json['more'],
              link: json['link'],

              // for generalevent.json
              eventDate: json['event-date'],
              eventDateAr: json['event-date-ar'],
            );
          }

          Event.fromSnapshot(DataSnapshot snapshot)
              : key = snapshot.key,
                title = snapshot.value['title'],
                startDate = snapshot.value['startDate'];

          toJson() {
            return {
              "title": title,
              "startDate": startDate,
            };
          }

        }

这是我的CloudEvents页面

代码语言:javascript
复制
    import 'package:events/UI/styleguide.dart';
    import 'package:events/models/event.dart' as e;
    import 'package:events/pages/account.dart';
    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:firebase_database/firebase_database.dart';
    import 'package:firebase_database/ui/firebase_animated_list.dart';
    import 'package:flutter/material.dart';
    import 'package:flutter/rendering.dart';
    import 'package:intl/intl.dart' as intl;

    final FirebaseAuth mAuth = FirebaseAuth.instance;
    final db = FirebaseDatabase.instance.reference();
    FirebaseUser mCurrentUser;

    List<e.Event> itemsEvent = List();
    e.Event itemEvent;
    DatabaseReference dbEvent;



    class CloudEvents extends StatefulWidget {
      final GlobalKey<ScaffoldState> scaffoldKey;

      const CloudEvents({Key key, @required this.scaffoldKey}) : super(key: key);

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

    class _CloudEventsState extends State<CloudEvents> {
      ScrollController _hideButtonController;
      var _isVisible;

      @override
      initState() {
        super.initState();

        ...
        
        itemEvent = e.Event();
        final FirebaseDatabase database = FirebaseDatabase.instance;
        dbEvent = database.reference().child('events');
        dbEvent.onChildAdded.listen(_onEntryAddedEvent);
        dbEvent.onChildChanged.listen(_onEntryChangedEvent);

        ...
      }

      _onEntryAddedEvent(Event event) {
        setState(() {
          itemsEvent.add(e.Event.fromSnapshot(event.snapshot));
        });
      }

      _onEntryChangedEvent(Event event) {
        var old = itemsEvent.singleWhere((entry) {
          return entry.key == event.snapshot.key;
        });
        setState(() {
          itemsEvent[e.Event.indexOf(old)] = e.Event.fromSnapshot(event.snapshot);
        });
      }

      @override
      Widget build(BuildContext context) {
        return showEvents();
      }

      Widget showEvents(BuildContext context) {

        return Container(
          height: MediaQuery.of(context).size.height,
          child: Stack(
            children: <Widget>[
              FirebaseAnimatedList(
                  query: dbEvent.child(mCurrentUser.uid),
                  itemBuilder: (_, DataSnapshot snapshot,
                      Animation<double> animation, int i) {
                    return new ListTile(
                      title: new Text(snapshot.value['title']),  //snapshot works well 
                      subtitle: new Text(itemsEvent[i].startDate), // this returns null
                    );
                  }),

              ...

            ],
          ),
        );
      }

      ...

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-20 16:41:27

我刚刚意识到这个问题,根据u/Cholojuanito's 评论 on reddit的说法。

我做了他最有可能的解决方案,然后我编辑了:

Text(itemsEvent[i].startDate)Text(e.Event.fromSnapshot(snapshot).startDate)

而且效果很好,谢谢大家在reddit上发表评论。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58020210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档