尝试将变量传递给Flutter应用程序中的FirebaseFirestoreWhere子句

问题描述 投票:0回答:1

如何将传入的变量作为传入的 ChapterName 放入Where子句中?

不确定我做错了什么,但传递的值似乎无法以我这样做的方式提供。我尝试用变量替换字符串。不允许。我尝试过使用许多替代方案但没有成功。似乎只有“文本”有效。

抱歉,我不是经验丰富的开发人员,但试图将其提供给团队使用。

有什么建议吗?

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:member_shmc_app/screens/home/members/members_admin/admin_member_details.dart';

//New starting point -- need to change to filter by User's Chapter Members ONLY
//Attempt to take HomePage and pass in ChapterName
// ignore: must_be_immutable
class MemberListHome extends StatefulWidget {
  MemberListHome({required this.chapterName, super.key});
  var chapterName = '';

  @override
  State<MemberListHome> createState() => _MemberListHomeState();
}

//Works now but need to replace Chapter Name with variable of chapterName
final Query<Map<String, dynamic>> _referenceMemberList = FirebaseFirestore
    .instance
    .collection('shmc_members')
    .where('memberChapter', isEqualTo: 'Gray Ghost');

class _MemberListHomeState extends State<MemberListHome> {
  late Stream<QuerySnapshot> _streamMemberItems;

  @override
  initState() {
    super.initState();
    _streamMemberItems = _referenceMemberList.snapshots();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          title: const Text("SHMC Chapter Members"),
          backgroundColor: const Color.fromARGB(255, 43, 55, 138),
          foregroundColor: Colors.white),
      body: StreamBuilder<QuerySnapshot>(
        stream: _streamMemberItems,
        builder: (BuildContext context, AsyncSnapshot snapshot) {
          if (snapshot.hasError) {
            return Center(child: Text(snapshot.error.toString()));
          }

          if (snapshot.connectionState == ConnectionState.active) {
            QuerySnapshot querySnapshot = snapshot.data;
            List<QueryDocumentSnapshot> listQueryDocumentSnapshot =
                querySnapshot.docs;

            return ListView.builder(
                itemCount: listQueryDocumentSnapshot.length,
                itemBuilder: (context, index) {
                  QueryDocumentSnapshot document =
                      listQueryDocumentSnapshot[index];
                  return MemberListItem(document: document);
                });
          }

          return const Center(child: CircularProgressIndicator());
        },
      ),
    );
  }
}

class MemberListItem extends StatefulWidget {
  const MemberListItem({
    super.key,
    required this.document,
  });

  final QueryDocumentSnapshot<Object?> document;

  @override
  State<MemberListItem> createState() => _MemberListItemState();
}

class _MemberListItemState extends State<MemberListItem> {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(5.0),
      child: ListTile(
        tileColor: Colors.white,
        minLeadingWidth: 10,
        onTap: () {
          Navigator.of(context).push(MaterialPageRoute(
              builder: (context) => AdminMemberDetails(widget.document.id)));
        },
        title: Text(widget.document['memberRoadname'] +
            ' - ' +
            widget.document['memberChapter']),
        subtitle: Text(widget.document['memberFullName'] +
            " - " +
            widget.document['memberCellPhone']),
        //leading: Image.asset('images/chapters/' + widget.document['chapterLogo']),
      ),
    );
  }
}
flutter firebase google-cloud-firestore
1个回答
0
投票

问题:

您在

_referenceMemberList
类之外定义
_MemberListHomeState
,这就是您无法访问
chapterName
变量的原因。

解决方案:

_referenceMemberList
定义移至
_MemberListHomeState
中,并使用
chapterName
中的
_referenceMemberList
变量作为
widget.chapterName

见下图:

class _MemberListHomeState extends State<MemberListHome> {

  Query<Map<String, dynamic>> get _referenceMemberList =>
      FirebaseFirestore.instance
          .collection('shmc_members')
          .where('memberChapter', isEqualTo: widget.chapterName);

  /// The rest of your code
}

注:

我将

_referenceMemberList
从类变量转换为 getter,因为
widget
(在
widget.chapterName
中使用)在初始化器中不可用,即将
_referenceMemberList
定义为类变量时。

© www.soinside.com 2019 - 2024. All rights reserved.