如何在Flutter中从Firebase数据库访问单独的子级?

时间:2019-01-18 01:54:16

标签: database firebase firebase-realtime-database dart flutter

嗨,我目前正在尝试在Flutter中访问数据库的一个孩子,以便可以将其链接到另一个孩子。我能够从一个孩子那里拉取数据,但无法将此数据与另一个孩子链接。我希望能够访问“记录”子项的字段并使用“志愿者”字段链接到“志愿者”子项,但无法使它们链接在一起。任何帮助将不胜感激!

The database structure is as follows:

这是“我的志愿者”课程的代码:

class Volunteer {
  String volunteerID;
  String name;
  String role;

  Volunteer(this.volunteerID, this.name, this.role);

  Volunteer.fromSnapshot(DataSnapshot snapshot)
      : volunteerID = snapshot.key,
        name = snapshot.value["name"],
        role = snapshot.value["role"];

  toJson() {
    return {
      "key": volunteerID,
      "name": name,
      "role": role
    };
  }
}

这是我的UI的代码:

class SignInPageState extends State<SignInPage> {

  List<Volunteer> volunteers;
  Volunteer volunteer;
  DatabaseReference dbRef;
  DatabaseReference volunteerRef;
  DatabaseReference recordRef;

  @override
  void initState() {
    super.initState();
    volunteers = new List();
    volunteer = Volunteer("","", "");
    final FirebaseDatabase database = FirebaseDatabase.instance;
    dbRef = database.reference();
    volunteerRef = database.reference().child('volunteer');
    recordRef = database.reference().child('record');

    dbRef.onChildAdded.listen(_onEntryAdded);
    dbRef.onChildChanged.listen(_onEntryChanged);

    volunteerRef.once().then((DataSnapshot snapshot) {
      Map<dynamic, dynamic> getMap = snapshot.value;
      getMap.forEach((key, values) {

        String volunteerRecord = recordRef.child('volunteer').toString();

        if (volunteerRecord == volunteer.volunteerID){

          volunteer.role = volunteerRecord;
        }
        volunteers.add(volunteer);
      });
    });
  }

  _onEntryAdded(Event event) {
    setState(() {
      volunteers.add(Volunteer.fromSnapshot(event.snapshot));
    });
  }

  _onEntryChanged(Event event) {
    var old = volunteers.singleWhere((entry) {
      return entry.volunteerID == event.snapshot.key;
    });
    setState(() {
      volunteers[volunteers.indexOf(old)] = Volunteer.fromSnapshot(event.snapshot);
    });
  }

  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
            padding: EdgeInsets.all(10.0),
            color: Colors.white,
            child: Column(
              children: <Widget>[
                Expanded(
                    flex: 8,
                    child: Container(
                      child: FirebaseAnimatedList(
                        query: volunteerRef,

                        itemBuilder: (BuildContext context, DataSnapshot snapshot,
                            Animation<double> animation, int index) {

                          return new ListTile(
                            title: Text(
                              (volunteers[index].name + " " + volunteers[index].role),
                              textAlign: TextAlign.center,
                              overflow: TextOverflow.ellipsis,
                              style: TextStyle(fontWeight: FontWeight.bold ,color: Color.fromRGBO(139, 195, 68, 1)),
                            ),
                            onTap: () {
                              SuccessSignInPage(volunteers[index].name);
                            },
                          );
                        },
                      ),
                    )
                ),
              ],
            )),
      ),
    );
  }

  void Back() async {
    await Navigator.of(context).pop();
  }

  void SuccessSignInPage(String name) async {
    var route = new MaterialPageRoute(
        builder: (BuildContext context) => new SignInSuccessPage(value: name));
    await Navigator.of(context).push(route);
  }
}

0 个答案:

没有答案