1

I have the following below widget:

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

class BirthdayWidget extends StatefulWidget {
  final DateTime birthday;
  final ValueChanged<DateTime> onChangedBirthday;

  const BirthdayWidget({
    Key key,
    @required this.birthday,
    @required this.onChangedBirthday,
  }) : super(key: key);

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

class _BirthdayWidgetState extends State<BirthdayWidget> {
  final controller = TextEditingController();
  final focusNode = FocusNode();

  @override
  void initState() {
    super.initState();

    setDate();
  }

  @override
  void didUpdateWidget(covariant BirthdayWidget oldWidget) {
    super.didUpdateWidget(oldWidget);

    setDate();
  }

  void setDate() => setState(() {
        controller.text = widget.birthday == null
            ? ''
            : DateFormat.yMd().format(widget.birthday);
      });

  @override
  Widget build(BuildContext context) => FocusBuilder(
        onChangeVisibility: (isVisible) {
          if (isVisible) {
            selectDate(context);
            //
          } else {
            FocusScope.of(context).requestFocus(FocusNode());
          }
        },
        focusNode: focusNode,
        builder: (hasFocus) => TextFormField(
          controller: controller,
          validator: (value) => value.isEmpty ? 'Is Required' : null,
          decoration: InputDecoration(
            prefixText: ' ',
            hintText: 'Your birthday',
            prefixIcon: Icon(Icons.calendar_today_rounded),
            border: OutlineInputBorder(),
          ),
        ),
      );

  Future selectDate(BuildContext context) async {
    final birthday = await showDatePicker(
      context: context,
      initialDate: widget.birthday ?? DateTime.now(),
      firstDate: DateTime(1950),
      lastDate: DateTime(2100),
    );

    if (birthday == null) return;

    widget.onChangedBirthday(birthday);
  }
}

class FocusBuilder extends StatefulWidget {
  final FocusNode focusNode;
  final Widget Function(bool hasFocus) builder;
  final ValueChanged<bool> onChangeVisibility;

  const FocusBuilder({
    @required this.focusNode,
    @required this.builder,
    @required this.onChangeVisibility,
    Key key,
  }) : super(key: key);

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

class _FocusBuilderState extends State<FocusBuilder> {
  @override
  Widget build(BuildContext context) => GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () => widget.onChangeVisibility(true),
        child: Focus(
          focusNode: widget.focusNode,
          onFocusChange: widget.onChangeVisibility,
          child: widget.builder(widget.focusNode.hasFocus),
        ),
      );
}

and I call this widget through the below code as I call it in a specific screen

Widget buildBirthday() => BirthdayWidget(
        birthday: user.dateOfBirth,
        onChangedBirthday: (dateOfBirth) =>
            setState(() => user = user.copy(dateOfBirth: dateOfBirth)),
      );

so for example I want hide the below Widget if the age below 18:

CustomTextFormField(
            onChanged: (passNo) => setState(
              () => user = user.copy(passportNumber: passNo),
            ),
            userValue: user.passportNumber,
            userFLName: 'Passport Number',
            keyBoardType: TextInputType.number,
          ),

I hope this could be clear enough :)..

Mahmoud Al-Haroon
  • 2,239
  • 7
  • 36
  • 72

1 Answers1

2

Wrap the widget you want to hide inside a Visibility() widget and set the visible value to age>=18

Visibility(
      visible: (DateTime.now().difference(birthday).inDays/365)>=18,
      child: CustomTextFormField(
            onChanged: (passNo) => setState(
              () => user = user.copy(passportNumber: passNo),
            ),
            userValue: user.passportNumber,
            userFLName: 'Passport Number',
            keyBoardType: TextInputType.number,
          ),
),

Suggested Answer by OP:

Edited

So I have found it could be work with the Visibility Widget I have done as the below code:


            if ((DateTime.now().difference(user.dateOfBirth).inDays / 365) >=
                18)
              CustomTextFormField(
                validation: (value) {
                  if (value.isEmpty) {
                    return 'Please enter Passport Number';
                  }
                  return null;
                },
                onChanged: (passNo) => setState(
                  () => user = user.copy(passportNumber: passNo),
                ),
                userValue: user.passportNumber,
                userFLName: 'Passport Number',
                keyBoardType: TextInputType.number,
              ),
MindStudio
  • 706
  • 1
  • 4
  • 13