我正在使用Stepper小部件制作一个用于创建配置文件的表单。在onStepContinue
方法中,如果它是最后一步,我将用于向后端发送数据的函数调用放在它的.whenComplete
方法中,并添加到主页的导航路线。
body: Stepper(
type: StepperType.horizontal,
currentStep: _activeCurrentStep,
steps: stepList(),
onStepContinue: () async {
final isLastStep = _activeCurrentStep == stepList().length - 1;
if (isLastStep) {
final authenticationNotifier =
Provider.of<AuthenticationNotifier>(context, listen: false);
var userEmail =
await authenticationNotifier.fetchUserEmail(context: context);
var profileName = profileNameController.text;
var profileBio = profileBioController.text;
await profileNotifier(false)
.createProfile(
context: context,
profileDTO: ProfileDTO(
useremail: userEmail,
profile_name: profileName,
profile_bio: profileBio,
))
.whenComplete(
() => Navigator.of(context).popAndPushNamed(HomeRoute));
} else if (_activeCurrentStep < (stepList().length - 1)) {
setState(() {
_activeCurrentStep += 1;
});
}
},
onStepCancel: _activeCurrentStep == 0
? null
: () {
setState(() {
_activeCurrentStep -= 1;
});
},
onStepTapped: (int index) {
setState(() {
_activeCurrentStep = index;
});
},
),
步进程序小部件位于自己的页面/支架中。它是从authview.dart文件中的按钮的onPressed
加载的。
onPressed: () {
authenticationNotifier.signup(
context: context,
useremail: signupEmailController.text,
userpassword: signupPasswordController.text);
Navigator.of(context)
.pushNamed(ProfileCreationRoute);
},
问题是,只要我在authview中按下注册按钮,步进页面就会显示一小部分秒,并加载主页,而不允许我创建配置文件。我需要它只显示步进器,只有在我填写个人资料详细信息并点击提交后才能进入主页。
我认为只有当按下按钮并且其父函数完成工作时才会调用.whenComplete
,在这种情况下,我想问题出在步进程序本身。
我还在if (isLastStep)
条件中添加了&& profileNameController.text.isNotEmpty
,但它不起作用。点击注册按钮将绕过步进器小部件,并在步进器完成构建后立即进入主视图。
我不明白发生了什么事。请帮忙。
编辑
通知程序中的createProfile函数是
class ProfileNotifier extends ChangeNotifier {
final ProfileAPI _profileAPI = ProfileAPI();
Future createProfile({
required BuildContext context,
required ProfileDTO profileDTO,
}) async {
try {
await _profileAPI.createProfile(profileDTO);
} catch (e) {
print(e.toString());
}
}
}
将数据发送到节点后端的API调用是
class ProfileAPI {
final client = http.Client();
final headers = {
'Content-type': 'application/json',
'Accept': 'application/json',
"Access-Control-Allow-Origin": "*",
};
// Create new Profile
Future createProfile(ProfileDTO profileDTO) async {
final String subUrl = "/profile/create/${profileDTO.useremail}";
final Uri uri = Uri.parse(APIRoutes.BaseURL + subUrl);
try {
final http.Response response = await client.post(uri,
body: jsonEncode(profileDTO.toJson()), headers: headers);
final statusCode = response.statusCode;
final body = response.body;
if (statusCode == 200) {
return body;
}
} catch (e) {
print(e.toString());
}
}
}
编辑2在将whenComplete
更改为then
时,linter显示此错误。
The argument type 'Future<Object?> Function()' can't be assigned to the parameter type 'FutureOr<dynamic> Function(dynamic)'. dart(argument_type_not_assignable)
该怎么办?请帮助
因此,从目前的情况来看,您正在使用whencomplete,但发生这种情况的原因是,每当它和失败或成功时,whencomplex都会运行。所以我认为你应该在完成时使用then方法它只会在成功的情况下运行。