Ошибка: Ожидалось «,» до этого. валидатор: подтвердите!(Строковое значение),

#flutter #flutter-layout #dart-null-safety #null-safety

Вопрос:

Здравствуйте, я получаю эту ошибку в flutter:

 lib/shared/components/components.dart:41:35: Error: Expected ',' before this.
      validator: validate!(String value),
                                  ^^^^^
lib/modules/login/login_screen.dart:36:33: Error: The argument type 'String? Function(String)' can't be assigned to the parameter type 'dynamic Function()?'.
                      validate: (String value){
                                ^
lib/shared/components/components.dart:41:35: Error: Getter not found: 'value'.
      validator: validate!(String value),
                                  ^^^^^
lib/shared/components/components.dart:41:27: Error: Too many positional arguments: 0 allowed, but 2 found.
Try removing the extra positional arguments.
      validator: validate!(String value),
                          ^


FAILURE: Build failed with an exception.

* Where:
Script 'C:srcflutterpackagesflutter_toolsgradleflutter.gradle' line: 1005

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> Process 'command 'C:srcflutterbinflutter.bat'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
 

Компоненты.код дротика-это:

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

Widget defaultButton(
    {double width = double.infinity,
      Color background = Colors.blue,
      double radius = 10.0,
      Function()? function,
      required String text,
      bool isUpperCase = true}) =>
    Container(
      height: 40.0,
      width: width,
      child: MaterialButton(
          onLongPress: () {},
          onPressed: function!() ,
          child: Text(
            isUpperCase ? text.toUpperCase() : text.toLowerCase(),
            style: TextStyle(color: Colors.white),
          )),
      decoration: BoxDecoration(
        borderRadius: BorderRadiusDirectional.circular(radius),
        color: background,
      ),
    );

Widget defaultFormFeild({
  required TextEditingController controller,
  required TextInputType type,
  void Function(String)? onSubmit,
  void Function(String)? onChange,
  required Function()? validate,
  required var label,
  required IconData prefix,
}) =>
    TextFormField(
      controller: controller,
      keyboardType: type,
      onFieldSubmitted: onSubmit, //do null checking
      onChanged: onChange, //do null checking
      validator: validate!(),
      decoration: InputDecoration(
          labelText: label,
          prefixIcon: Icon(prefix),
          border: OutlineInputBorder()
      ),
    );
 

экран входа в систему.код дротика:

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:udemy_flutter/shared/components/components.dart';
class LoginScreen extends StatelessWidget {
  var emailController = TextEditingController();
  var passController = TextEditingController();
  var formKey = GlobalKey<FormState>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Center(
          child: SingleChildScrollView(
            child: Form(
              key: formKey,
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  const Text(
                      'Login',
                    style: TextStyle(
                      fontSize: 40.0,
                      fontWeight: FontWeight.bold
                    ),
                  ),
                  const SizedBox(
                    height: 40.0,
                  ),
                  defaultFormFeild(
                      controller: emailController,
                      label: 'Email',
                      prefix: Icons.email,
                      type: TextInputType.emailAddress,
                      validate: (String value){
                        if(value.isEmpty != null){
                          return 'Email Cannot Be Empty';
                        }
                        return null;
                      }
                  ),
                  const SizedBox(
                    height: 15.0,
                  ),
                  TextFormField(
                    controller: passController,
                    obscureText: true,
                    keyboardType: TextInputType.visiblePassword,
                    decoration: const InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: 'Password',
                      prefixIcon: Icon(
                        Icons.lock
                      ),
                      suffixIcon: Icon(
                        Icons.remove_red_eye,
                      )
                    ),
                    onChanged: (value) {
                      print(value);
                    },
                    onFieldSubmitted: (value) {
                      print(value);
                    },
                    validator: (value) {
                      if(value!.isEmpty){
                        return 'Password cannot be empty';
                      }
                      return null;
                    },
                  ),
                  const SizedBox(
                    height: 10.0,
                  ),
                  defaultButton(
                    function: (){
                      print(emailController.text);
                      print(passController.text);
                    },
                    text: 'Login',
                  ),
                  const SizedBox(
                    height: 10.0,
                  ),
                  defaultButton(
                    text: 'ReGister',
                    function: () {
                      print('You have just clicked on register');
                    },
                    background: Colors.red,
                    isUpperCase: false
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      const Text('Don't you have an account?'),
                      TextButton(onPressed: () {}, child: const Text(
                        'Register Now'
                      ))
                    ],
                  )
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
 

Может ли кто-нибудь сказать мне, где я ошибаюсь, я новичок в платформе Flutter и пытаюсь создавать экраны для различных применений, так как у меня были проблемы с нулевой безопасностью, и мне удалось ее решить, но я точно не знал, в чем проблема с этим кодом

Ответ №1:

Поле Textform принимает FormFieldValidator? как validator . Определение FormFieldValidator таково:

 typedef FormFieldValidator<T> = String? Function(T? value);
 

Это не соответствует вашему определению Function()? validator . Вам нужно изменить свой тип, чтобы он соответствовал параметру FormFieldValidator.

   void Function(String)? onChange,
  required Function()? validate,
  required var label,
 

станет

   void Function(String)? onChange,
  required String Function(String)? validate
  required var label,
 

Затем возникает вторая проблема. Вы выполняете эту функцию до того, как назначите ее. Это не нужно и вызывает несоответствие типов. В defaultFormFeild измените код, чтобы не выполнять валидатор перед передачей его в поле формы.

       onChanged: onChange, //do null checking
      validator: validate,
      decoration: InputDecoration(
 

Комментарии:

1. Большое спасибо!!!!