Flutter:如何在多个类中使用表单键

时间:2020-04-22 12:26:23

标签: flutter

我正在创建一个带有表单的屏幕,供用户创建配方(这是AddRecipeForm类)。我创建了一个新类(AddRecipeSteps)以添加文本表单字段,用户可以在其中定义配方的步骤。如何将AddRecipeForm类中的formkey访问/传递给另一个AddRecipeSteps类?为了能够保存状态并使用验证器,我也有一个Recipe类,其中输入被“存储”为Recipe对象。 要获取完整的代码:https://codeshare.io/5QRb17https://codeshare.io/5ZOzV7https://codeshare.io/2BRBrp

这是AddRecipeForm类的一部分:

class AddRecipeForm extends StatefulWidget {
  @override
  _AddRecipeFormState createState() => _AddRecipeFormState();
}

class _AddRecipeFormState extends State<AddRecipeForm> {
  final formKey = GlobalKey<FormState>();
  Recipe recipe = Recipe();

  int step = 1;

  @override
  Widget build(BuildContext context) {

    return Form(
      key: formKey,
      child: ListView(
        children: <Widget>[
          //...
          AddRecipeSteps(
            //TODO: want to pass the formkey to AddRecipeSteps class
          ),
          //...
        ],
      ),
    );
  }

这是AddRecipeSteps类:

import 'package:cibus/services/recipe.dart';
import 'package:flutter/material.dart';
import 'my_text_form_field.dart';

class AddRecipeSteps extends StatefulWidget {
  @override
  _AddRecipeStepsState createState() => _AddRecipeStepsState();
}

class _AddRecipeStepsState extends State<AddRecipeSteps> {
  int steps = 1;

  List<Widget> buildSteps() {
    List<Widget> listOfSteps = [];

    for (int i = 1; i <= steps; i++)
      listOfSteps.add(Padding(
        padding: const EdgeInsets.all(8.0),
        child: MyTextFormField(
          labelText: "Step $i",
          validator: (String step) {
            if (step.isEmpty) {
              return 'Enter a Description';
            }
            else {
              //we want to use formKey from AddRecipeForm class
              formKey.currentState.save();
              return null;
            }
          },
          onSaved: (String step){
            //want to add the input to the recipe object
            recipe.steps.add(step);
          },
        ),
      ));

    listOfSteps.add(
      Center(
        child: RaisedButton(
          child: Text("Add step"),
          onPressed: () {
            setState(() {
              steps++;
            });
          },
        ),
      ),
    );

    return listOfSteps;
  }

  @override
  Widget build(BuildContext context) {
    return Column(
        children: buildSteps(),
    );
  }
}

0 个答案:

没有答案