Как сделать проверку возраста в флаттере - PullRequest
1 голос
/ 16 апреля 2020

Моя цель - проверить возраст пользователя по введенному дню рождения и вернуть ошибку, если пользователю не исполнилось 18 лет. Но я понятия не имею, как это сделать. Формат даты "дд-мм-гггг". Есть идеи как это сделать?

Ответы [ 4 ]

1 голос
/ 16 апреля 2020

Лучшее подтверждение возраста, которое я когда-либо придумал, основано на регулярном выражении.
В приведенном ниже логе c указаны все возрасты, связанные с точкой останова.

// regex for validation of date format : dd.mm.yyyy, dd/mm/yyyy, dd-mm-yyyy
RegExp regExp = new RegExp(
    r"^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$",
    caseSensitive: true,
    multiLine: false,
  );

//method to calculate age on Today (in years)
  int ageCalculate(String input){
  if(regExp.hasMatch(input)){
  DateTime _dateTime = DateTime(
      int.parse(input.substring(6)),
      int.parse(input.substring(3, 5)),
      int.parse(input.substring(0, 2)),
    );
    return DateTime.fromMillisecondsSinceEpoch(
                DateTime.now().difference(_dateTime).inMilliseconds)
            .year -
        1970;
  } else{
    return -1;
  }
}

void main() {
// input values and validations examples
  var input = "29.02.2008";
  print("12.13.2029 : " + regExp.hasMatch("12.13.2029").toString());
  print("29.02.2028 : " + regExp.hasMatch("29.02.2028").toString());
  print("29.02.2029 : " + regExp.hasMatch("29.02.2029").toString());
  print("11/12-2019 : " + regExp.hasMatch("11/12-2019").toString());
  print("23/12/2029 : " + regExp.hasMatch("23/12/2029").toString());
  print("23/12/2029 : " + regExp.hasMatch(input).toString());
  print("sdssh : " + regExp.stringMatch("sdssh").toString());   
  print("age as per 29.02.2008 : " + ageCalculate(input).toString());
}

Выходные данные

 12.13.2029 : false
 29.02.2028 : true
 29.02.2029 : false
 11/12-2019 : false
 23/12/2029 : true
 23/12/2029 : true
 sdssh : null
 age as per 29.02.2008 : 12

Надеюсь, вы найдете это полезным. :)

0 голосов
/ 16 апреля 2020
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';     

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Home(),      
    );
  }
}

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

  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  String dateFormate;
  @override
  Widget build(BuildContext context) {
     var dateNow = new DateTime.now();
     var givenDate = "1969-07-20";
     var givenDateFormat = DateTime.parse(givenDate);
     var diff = dateNow.difference(givenDateFormat);
     var year = ((diff.inDays)/365).round();

    return Container(
      child: (year < 18)?Text('You are under 18'):Text("$year years old"),
    );
  }
}
0 голосов
/ 16 апреля 2020

Пакет

Чтобы легко разобрать дату, нам нужен пакет intl:

https://pub.dev/packages/intl# -install-tab-

Поэтому добавьте это зависимость от файла youd pubspec.yamlget новые зависимости)

Решение # 1

Вы можете просто сравнить годы:

bool isAdult(String birthDateString) {
  String datePattern = "dd-MM-yyyy";

  DateTime birthDate = DateFormat(datePattern).parse(birthDateString);
  DateTime today = DateTime.now();

  int yearDiff = today.year - birthDate.year;
  int monthDiff = today.month - birthDate.month;
  int dayDiff = today.day - birthDate.day;

  return yearDiff > 18 || yearDiff == 18 && monthDiff >= 0 && dayDiff >= 0;
}

Но это не всегда правда, потому что к концу текущего года вы «не взрослые».

Solution # 2

Так что лучшим решением будет перенести день рождения на 18 и сравнить с текущей датой.

bool isAdult2(String birthDateString) {
  String datePattern = "dd-MM-yyyy";

  // Current time - at this moment
  DateTime today = DateTime.now();

  // Parsed date to check
  DateTime birthDate = DateFormat(datePattern).parse(birthDateString);

  // Date to check but moved 18 years ahead
  DateTime adultDate = DateTime(
    birthDate.year + 18,
    birthDate.month,
    birthDate.day,
  );

  return adultDate.isBefore(today);
}
0 голосов
/ 16 апреля 2020

Разницу в году можно найти следующим образом.

String _data = '16-04-2000';

    DateTime _dateTime = DateTime(
      int.parse(_data.substring(6)),
      int.parse(_data.substring(3, 5)),
      int.parse(_data.substring(0, 2)),
    );
    int yeardiff = DateTime.fromMillisecondsSinceEpoch(
                DateTime.now().difference(_dateTime).inMilliseconds)
            .year -
        1970;
    print(yeardiff);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...