我有通过namedRoute传递的参数。我目前使用访问它们
final args = ModalRoute.of(context)!.settings.arguments as UserPack;
在我的小部件Build中。我正试图为需要args
数据的流创建一个函数,但不幸的是,我无法访问Widget Build之外的参数,这意味着我无法获得streamIndividualPackList()
的packID
。我需要在构建Widget之前构建该Stream。
class IndividualPack extends StatefulWidget {
const IndividualPack({Key? key}) : super(key: key);
@override
State<IndividualPack> createState() => _IndividualPackState();
}
Stream<QuerySnapshot<Map<String, dynamic>>> streamIndividualPackList(
String packID) {
FirebaseFirestore db = FirebaseFirestore.instance;
return db
.collection('PackList')
.doc(packID)
.collection('PackContents')
.orderBy('itemName')
.snapshots();
}
class _IndividualPackState extends State<IndividualPack> {
FirebaseAnalytics analytics = FirebaseAnalytics.instance;
//gets the Firebase db
FirebaseFirestore db = FirebaseFirestore.instance;
String userID = FirebaseAuth.instance.currentUser!.uid;
final PageController pageViewController = PageController();
@override
Widget build(BuildContext context) {
final args = ModalRoute.of(context)!.settings.arguments as UserPack;
ModalRoute
取决于上下文,您可以使用addPostFrameCallback
的可空数据来分配它。
int? data;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
data = ModalRoute.of(context)?.settings.arguments as int?;
});
}
您只需要在构建方法中为null设置数据即可。
int? data;
@override
Widget build(BuildContext context) {
data ??= ModalRoute.of(context)?.settings.arguments as int?;
在使用可为null的数据之前进行null检查。