Flutter访问ModalRoute.of(上下文)!settings.arguments



我有通过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检查。

最新更新