flutter - 在 Stepper 中保持状态
问题描述
我的步进器中有多个步骤。在每个 Step 之间移动时如何保持 Step 的状态?
我已经尝试添加 AutomaticKeepAliveClientMixin,但它仍然没有保持状态:
class _MyHomePageState extends State<MyHomePage> with AutomaticKeepAliveClientMixin<MyHomePage> {
int currentStep = 0;
List<Step> stepList = [
Step(
title: Text("Page A"),
content: Column(
children: <Widget>[
Text("Page A"),
TextField(
decoration: InputDecoration(
border: InputBorder.none,
hintText: "Enter anything"
),
),
],
)
),
Step(
title: Text("Page B"),
content: Text("Page B")
),
Step(
title: Text("Page C"),
content: Text("Page C")
),
Step(
title: Text("Page D"),
content: Text("Page D")
),
Step(
title: Text("Page E"),
content: Text("Page ")
),
];
@override
Widget build(BuildContext context) {
super.build(context);
return Scaffold(
body: Stepper(
steps: stepList,
type: StepperType.horizontal,
currentStep: currentStep,
onStepContinue: nextStep,
onStepCancel: cancelStep,
),
);
}
void nextStep(){
setState(() {
if(currentStep < stepList.length - 1)
currentStep++;
});
}
void cancelStep(){
setState(() {
if(currentStep > 0)
currentStep--;
});
}
@override
bool get wantKeepAlive => true;
}
如果我在文本字段中添加任何内容,导航到 PageB,然后导航回 PageA,文本字段将重置为空。
如何保持每个步骤的“页面”的状态?
编辑:可能应该早点披露这一点。我有 5 个步骤,每个步骤包含 8-12 个字段,包括文本字段、复选框、下拉列表等。这是一个多步骤表单。我知道你可以创建一个类级别的 TextFieldController 来拥有一个“全局”变量来跟踪 TextField 在 Step 中的状态,但这意味着我需要大约 50 个类级别的变量,代码看起来太复杂了。这就是我使用 AutomaticKeepAliveClientMixin 的原因,但它不起作用。有没有更好的方法来处理这个?
解决方案
正在发生的事情是TextField
,当您从另一个导航到它时,您正在重建Step
,因此价值正在重置。
解决方案:
- 将您的回报转换
List<Step>
为get
List<Step>
List<Step> get stepList => [
- 这样做的原因是让您的列表能够访问全局变量。
- 创建一个
TextEditingController
全局变量:TextEditingController textEditingController = TextEditingController();
将该控制器提供给您
TextField
,如下所示:TextField( controller: textEditingController, decoration: InputDecoration( border: InputBorder.none, hintText: "Enter anything" ), ),
现在将会发生的是,当您拥有 时TextEditingController
,无论何时重建它都会使用控制器来获取值,因此,每当您在sTextField
之间切换时,您的值都不会重置。Step
TextField
我已经编辑了您的代码,以下是具有上述更改的代码:
class _MyHomePageState extends State<MyHomePage> with AutomaticKeepAliveClientMixin<MyHomePage> {
int currentStep = 0;
TextEditingController textEditingController = TextEditingController();
List<Step> get stepList => [
Step(
title: Text("Page A"),
content: Column(
children: <Widget>[
Text("Page A"),
TextField(
controller: textEditingController,
decoration: InputDecoration(
border: InputBorder.none,
hintText: "Enter anything"
),
),
],
)
),
Step(
title: Text("Page B"),
content: Text("Page B")
),
Step(
title: Text("Page C"),
content: Text("Page C")
),
Step(
title: Text("Page D"),
content: Text("Page D")
),
Step(
title: Text("Page E"),
content: Text("Page ")
),
];
@override
Widget build(BuildContext context) {
super.build(context);
return Scaffold(
body: Stepper(
steps: stepList,
type: StepperType.horizontal,
currentStep: currentStep,
onStepContinue: nextStep,
onStepCancel: cancelStep,
),
);
}
void nextStep(){
setState(() {
if(currentStep < stepList.length - 1)
currentStep++;
});
}
void cancelStep(){
setState(() {
if(currentStep > 0)
currentStep--;
});
}
@override
bool get wantKeepAlive => true;
}
希望对你有帮助,如有疑问请留言。如果此答案对您有帮助,请接受并投票。
推荐阅读
- unix - 两个进程如何共享同一个共享库?
- react-native - 平面列表随机圆设计反应原生
- javascript - 返回 JSX 的 React 类方法的流注解
- c# - 为已安装的应用程序分配单独的默认打印机
- python - 我可以在一台机器上将 h5 文件读取为 bytearray,将该 bytearray 流式传输到另一台机器,然后从另一台机器上的 bytearray 加载它吗?
- python - 如何在 python 和 NLTK 中计算预测概率?
- mysql - SQL 从另一个表中获取数据
- design-patterns - 如何初始化工厂?
- android - android sqlite数据库检索有问题
- go - 使用第 3 个服务器在 2 个 FTP 服务器之间进行代理以进行故障转移