我对 flutter/Dart 编程非常陌生,对下面的代码感到困惑。我没有编写代码,但我想用它在 table_calendar 插件的日历网格上显示事件标记。
class calEvent {
final String title;
const calEvent(this.title);
@override
String toString() => title;
}
/// Example events.
///
/// Using a [LinkedHashMap] is highly recommended if you decide to use a map.
final kEvents = LinkedHashMap<DateTime, List<calEvent>>(
equals: isSameDay,
hashCode: getHashCode,
)..addAll(_kEventSource);
**<<<<<< I think FirestoreService().getEvent() would go here but I don't know how to add it or convert from Stream<List<Event>> to LinkedHashMap<DateTime, List<calEvent>> >>>>>>**
final _kEventSource = Map.fromIterable(List.generate(50, (index) => index),
key: (item) => …Run Code Online (Sandbox Code Playgroud) 我主要通过阅读这里的帖子和观看 YouTube 视频来学习 flutter,但似乎我已经达到了视频不能满足我需要的程度,所以我来这里寻求帮助。
我正在尝试了解 Streams、Firebase 和映射。
我需要使用 Riverpod 创建一个 StreamProvider。这是我用来创建 StreamProvider 的代码:
final trxnStreamProvider = StreamProvider.autoDispose<List<Trxns>>((ref) {
final stream = firestoreService.getAgencyTrxns();
return stream.map((snapshot) => snapshot.docs.map((doc) =>
Trxns.fromFirestore(doc.data)).toList());
});
Run Code Online (Sandbox Code Playgroud)
我在这段代码中从 Firebase 获取流:
Stream<QuerySnapshot> getAgencyTrxns() async* {
yield* FirebaseFirestore.instance
.collection('agency').doc(globals.agencyId)
.collection('trxns')
.where('trxnStatus', isNotEqualTo: 'Closed')
.snapshots();
}
Run Code Online (Sandbox Code Playgroud)
因此,我根据上面的代码片段从 Firebase 获取了 QuerySnapshot。这效果很好。
然后,此 QuerySnapshot 返回到我创建 StreamProvider 的第一个代码片段中的“stream”变量。
然后,QuerySnapshot 变量“stream”被映射到 <List> 并通过此代码返回到 trxnStreamProvider。
return stream.map((snapshot) => snapshot.docs.map((doc) =>
Trxns.fromFirestore(doc.data)).toList());
Run Code Online (Sandbox Code Playgroud)
我在“doc.data”处收到错误,指出:参数类型“对象?” Function()' 无法分配给参数类型 'Map<String,dynamic>'。
我试图了解这行代码到底在做什么,我需要你的帮助。
return stream.map((snapshot) => snapshot.docs.map((doc) =>
Trxns.fromFirestore(doc.data)).toList());
Run Code Online (Sandbox Code Playgroud)
让我告诉你我认为它在做什么:
变量stream有一个名为“map”的方法,调用该方法将QuerySnapshot映射到列表。我不确定“快照”来自哪里,但我认为它是通过此调用 firestoreService.getAgencyTrxns() …
我需要将字符串从一个类传递到另一个类,但出现错误。
这是我想要从中传递参数的类的代码:
onTap: () {
String titleCompanyId = snapshot.data?.docs[index].id;
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const TitleCompanyScreen(false, snapshot.data?.docs[index].id),
),
);
},
Run Code Online (Sandbox Code Playgroud)
错误出现在我传递的第二个参数上(snapshot.data?.docs[index].id),这是错误:
无效的常量值。
该参数是来自 Cloud Firestore 的文档 ID。
这是我接收参数的代码:
class TitleCompanyScreen extends ConsumerStatefulWidget {
const TitleCompanyScreen([
this.isNewTitleCompany,
this.titleCompanyId,
Key? key,
]) : super(key: key);
final bool? isNewTitleCompany;
final String? titleCompanyId;
@override
ConsumerState<TitleCompanyScreen> createState() => _TitleCompanyScreenState();
}
Run Code Online (Sandbox Code Playgroud)
我如何传递这个参数?谢谢
更新:
这是我在第一个答案之后得到的。
onTap: () {
String? titleCompanyId = snapshot.data?.docs[index].id;
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
const TitleCompanyScreen(false, titleCompanyId),
),
);
},
Run Code Online (Sandbox Code Playgroud)
现在,我在 titleCompanyId 参数上收到此错误:
Arguments …Run Code Online (Sandbox Code Playgroud)