尝试使用可重用的小部件导航到不同的场景时出错,并向其传递不同的功能(设置为 InkWell 的 onTap)



错误

生成ProfileSettings时引发了以下断言(脏,依赖项:[MediaQuery,_继承的ProviderScope<FirebaseService>](:在生成过程中调用了setState((或markNeedsBuild((。这个Overlay小部件不能标记为需要构建,因为框架已经在构建小部件的过程。可以在构建阶段将小部件标记为需要构建前提是它的祖先之一正在建造。由于框架在子窗口之前构建父窗口小部件,这意味着将始终构建脏的子窗口小部件。否则,框架可能不会在这个构建阶段访问这个小部件。调用setState((或markNeedsBuild((的小部件是:覆盖-[Labeled全局密钥#dfb28]发出违规调用时当前正在构建的小部件是:配置文件设置

导致错误的相关小部件是:配置文件设置配置文件设置:file:///C:/Thrills/Thrills/lib/screens/profile/profile.dart:242:31

代码

可重复使用的小部件(在"设置"页面中(:

buildButton(IconData icon, String label, void fcn) {
return Container(
child: Material(
color: Colors.transparent,
clipBehavior: Clip.hardEdge,
child: InkWell(
onTap: () => fcn,
... [ some code ] ...

调用小部件(在"设置"页面中(:

... [ some code ] ...
Container(
padding:
EdgeInsets.only(left: 15.0, top: 20.0, bottom: 5.0),
alignment: Alignment.topLeft,
child: Text(
"Account",
style: TextStyle(
color: Colors.black,
fontSize: 18,
),
),
),
buildButton(Icons.email, "Email",
goToPersonalInfoScreen(context, "Email")),
buildButton(Icons.date_range, "Birthday", {}),
... [ some code ] ...

函数调用设置页面:

void goToSettings(BuildContext context) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ProfileSettings(
currentUserId: widget.currentUserId,
),
),
);
}

要导航到的屏幕:

void goToPersonalInfoScreen(BuildContext context, String title) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PersonalInfo(
currentUserId: currentUserId,
title: title,
),
),
);
}

流程中的最后一个屏幕(显示添加到小部件树后立即调用的内容(:

class PersonalInfo extends StatefulWidget {
const PersonalInfo({
Key? key,
required this.currentUserId,
required this.title,
}) : super(key: key);
final String currentUserId;
final String title;
@override
_PersonalInfoState createState() => _PersonalInfoState();
}
class _PersonalInfoState extends State<PersonalInfo> {
TextEditingController textController = TextEditingController();
late UserModel currentUser;
late final FirebaseService fbs;
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies() async {
super.didChangeDependencies();
fbs = Provider.of<FirebaseService>(context);
await fbs.getCurrentUserData().then((value) => {
currentUser = value,
setField(),
});
}
setField() {
setState(() {
if (widget.title == "Email")
textController.text = currentUser.email;
else if (widget.title == "Radius")
textController.text = currentUser.radius.toString();
/* displayNameController.selection = TextSelection.fromPosition(
TextPosition(offset: displayNameController.text.length)); */
});
}

initState((和didChangeDependencies((在构建运行之前运行,setState((({}(触发构建函数,这就是导致此错误的原因。

您应该从setField(({}方法中删除setState((({}(。

setField() {
if (widget.title == "Email")
textController.text = currentUser.email;
else if (widget.title == "Radius")
textController.text = currentUser.radius.toString();
/* displayNameController.selection = TextSelection.fromPosition(
TextPosition(offset: displayNameController.text.length)); */
}

最新更新