У меня есть виджет Form, в котором около 30 TextFormField виджетов. Он предназначен для использования в качестве веб-приложения. Я стараюсь изо всех сил иметь максимально возможную скорость. Виджеты TextFormField имеют разные средства форматирования ввода текста, контроллеры, некоторые из них являются обязательными, а некоторые - необязательными. Как я могу использовать ListView.builder внутри Form, чтобы виджеты TextFormField загружались по мере необходимости?

-1
Amani 20 Май 2021 в 14:54

1 ответ

Лучший ответ

Если я мог понять, вам нужно создать форму с ListView.builder, которая построит 30 TextFormField, если это правильно, вам нужно только поместить ListView.builder внутри формы следующим образом:

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();
  List validators = [
    (value) {
      if (value == null || value.isEmpty) {
        return 'Please enter the number';
      }
      return null;
    },
    (value) {
      if (value == null || value.isEmpty) {
        return 'Please enter the email';
      }
      return null;
    },
    (value) {
      if (value == null || value.isEmpty) {
        return 'Please enter the password';
      }
      return null;
    },
  ];
  List formatters = [
    FilteringTextInputFormatter.digitsOnly,
    FilteringTextInputFormatter.allow(RegExp('[a-zA-Z]')),
    FilteringTextInputFormatter.deny(RegExp(r'[/\\]'))
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Form(
        key: _formKey,
        child: ListView.builder(
          itemCount: 3,
          itemBuilder: (context, index) {
            return TextFormField(
              validator: validators[index],
              inputFormatters: [formatters[index]],
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Text('Click'),
        onPressed: () {
          if (_formKey.currentState.validate()) {
            // If the form is valid, display a snackbar. In the real world,
            // you'd often call a server or save the information in a database.
            ScaffoldMessenger.of(context)
                .showSnackBar(SnackBar(content: Text('Processing Data')));
          }
        },
      ),
    );
  }
}

Это проверит, все ли 30 TextFormField не пусты.

1
Edivaldo Marco 20 Май 2021 в 14:41