【发布时间】:2023-02-08 19:59:35
【问题描述】:
我有一个推送新屏幕的小部件,在新屏幕中我再次使用 Navigator 推送一个新屏幕。
屏幕 1 - 有状态的小部件,在点击元素时调用此函数:
void goToBreedScreen() {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BreedCategoryScreen(
onBreedPicked: (DomainBreedCategory val) {
setState(() {
breed = val;
});
},
currentSelectedBreed: breed,
allBreeds: allBreeds,
)));
}
屏幕2——看goTo()函数,只要我调用Navigator.push()两次就会出现新的屏幕。但不是当它被调用一次?
import 'package:fe/screens/task/choice_card.dart';
import 'package:flutter/material.dart';
import '../../../common/custom_app_bar.dart';
import '../../../model/domain_breed_category.dart';
import '../../task/breed_avatar.dart';
import 'breed_choice_screen.dart';
class BreedCategoryScreen extends StatefulWidget {
final Function onBreedPicked;
final List<DomainBreedCategory> allBreeds;
final DomainBreedCategory? currentSelectedBreed;
const BreedCategoryScreen(
{Key? key,
required this.onBreedPicked,
this.currentSelectedBreed,
required this.allBreeds})
: super(key: key);
@override
State<BreedCategoryScreen> createState() => _BreedCategoryScreenState();
}
class _BreedCategoryScreenState extends State<BreedCategoryScreen> {
void goTo(){
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => const Scaffold(
// body: Text('bla'),
// ),
// ));
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const Scaffold(
body: Text('bla'),
),
));
}
List<Widget> getCategories(BuildContext context) {
widget.allBreeds.sort((a, b) => a.name[0].compareTo(b.name[0]));
return widget.allBreeds
.map((DomainBreedCategory e) => Padding(
padding: const EdgeInsets.symmetric(vertical: 3),
child: ChoiceCard(
onTapped: () {
goTo();
},
avatar: BreedAvatar(
name: e.name,
size: 25.0,
),
label: e.name,
isSelected: widget.currentSelectedBreed != null &&
widget.currentSelectedBreed?.id == e.id),
))
.toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: 'Breed category',
),
body: SafeArea(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 20),
child: Column(
children: getCategories(context),
),
),
),
),
);
}
}
可能是什么原因呢?
【问题讨论】:
-
你为什么要从
Screen 1传递BuildContext?在调用Navigator.push时,您应该使用_BreedCategoryScreenState的context以按预期工作。 -
好吧,这只是我用作测试的一些答案,有一些答案暗示原因是错误的上下文)我现在将更新上面的代码,没有传递上下文,但它仍然无法正常工作
-
当我调用 push 两次时,行为仍然是 push 只起作用