Flutter-onStepContinue在构建时自动调用



我正在使用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方法它只会在成功的情况下运行。

相关内容

  • 没有找到相关文章

最新更新