generic_text_field_states 1.0.5 copy "generic_text_field_states: ^1.0.5" to clipboard
generic_text_field_states: ^1.0.5 copied to clipboard

Generic text field states for use with creating a single text field widget for the whole app.

example/example.dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter/material.dart';
import 'package:generic_text_field_states/generic_text_field_states.dart';

final emailProvider =
    StateNotifierProvider<TextFieldStateProvider, TextFieldState>(
        (ref) => TextFieldStateProvider(TextFieldState.initial()));
final passwordProvider =
    StateNotifierProvider<TextFieldStateProvider, TextFieldState>(
        (ref) => TextFieldStateProvider(TextFieldState.initial()));

Future<void> signIn({required String password, required String email}) async {
  //Signed in
}

void main() {
  runApp(MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
        child: Column(
      children: [
        GenericTextField(
          provider: emailProvider,
          fieldType: FieldType.email(),
          valueName: 'Email Address',
        ),
        GenericTextField(
          provider: passwordProvider,
          fieldType: FieldType.password(),
          valueName: 'Password',
        ),
      ],
    ));
  }
}

class GenericTextField extends ConsumerWidget {
  final StateNotifierProvider<TextFieldStateProvider, TextFieldState> provider;
  final FieldType fieldType;
  final String valueName;

  const GenericTextField({
    Key? key,
    required this.provider,
    required this.fieldType,
    required this.valueName,
  }) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final providerNotifier = ref.read(provider.notifier);
    final providerState = ref.watch(provider);
    return TextField(
      onChanged: (value) => providerNotifier.changeValue(
        fieldType: fieldType,
        value: value,
        valueName: valueName,
      ),
      decoration: InputDecoration(
        errorText: providerState.maybeWhen(
          orElse: () => null,
          invalid: (error) => error,
        ),
      ),
    );
  }
}

class LoginButton extends ConsumerWidget {
  const LoginButton({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final emailState = ref.watch(emailProvider);
    final passwordState = ref.watch(passwordProvider);
    return ElevatedButton(
      onPressed: () => signIn(
        password: passwordState.maybeWhen(
          orElse: () => '',
          valid: (value) => value,
        ),
        email: emailState.maybeWhen(
          orElse: () => '',
          valid: (value) => value,
        ),
      ),
      child: Text('Submit'),
    );
  }
}
0
likes
50
pub points
0%
popularity

Publisher

verified publishergodfrey-computing.com

Generic text field states for use with creating a single text field widget for the whole app.

Repository (GitHub)
View/report issues

License

GPL-3.0 (LICENSE)

Dependencies

flutter_riverpod, freezed_annotation, intl, simple_validations

More

Packages that depend on generic_text_field_states