Skip to content

gzeinnumer/flutter_d21_sosial_media

Repository files navigation

flutter_d21_sosial_media

  • auth_repository.dart
class AuthRepository{
  Future<void> login() async{
    await Future.delayed(const Duration(seconds: 3));
  }
}
  • login_view.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_d21_sosial_media/auth_repository.dart';
import 'package:flutter_d21_sosial_media/bloc/login/login_bloc.dart';
import 'package:flutter_d21_sosial_media/bloc/login/login_event.dart';
import 'package:flutter_d21_sosial_media/bloc/login/login_state.dart';
import 'package:flutter_d21_sosial_media/bloc/login/login_status.dart';

class LoginView extends StatelessWidget {
  final _formKey = GlobalKey<FormState>();

  LoginView({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: MultiBlocProvider(
        providers: [
          BlocProvider<LoginBloc>(
            create: (context) =>
                LoginBloc(authRepository: context.read<AuthRepository>()),
          ),
        ],
        child: _loginForm(),
      ),
    );
  }

  Widget _loginForm() {
    return BlocListener<LoginBloc, LoginState>(
        listener: (context, state) {
          final status = state.status;
          if (status is SubmissionFailed) {
            _showSnackbar(context, status.exception.toString());
          }
        },
        child: Form(
          key: _formKey,
          child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 40),
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  _usernameField(),
                  _passwordField(),
                  _loginBtn(),
                ],
              ),
            ),
          ),
        ));
  }

  Widget _usernameField() {
    return BlocBuilder<LoginBloc, LoginState>(builder: (context, state) {
      return TextFormField(
        decoration: const InputDecoration(
          icon: Icon(Icons.person),
          hintText: "Username",
        ),
        validator: (value) => state.isValidUsername ? null : "To short",
        onChanged: (value) => context
            .read<LoginBloc>()
            .add(LoginUsernameChangedEvent(username: value)),
      );
    });
  }

  Widget _passwordField() {
    return BlocBuilder<LoginBloc, LoginState>(builder: (context, state) {
      return TextFormField(
        obscureText: true,
        decoration: const InputDecoration(
          icon: Icon(Icons.security),
          hintText: "Password",
        ),
        validator: (value) => state.isValidPassword ? null : "To short",
        onChanged: (value) => context
            .read<LoginBloc>()
            .add(LoginPasswordChangedEvent(password: value)),
      );
    });
  }

  Widget _loginBtn() {
    return BlocBuilder<LoginBloc, LoginState>(builder: (context, state) {
      return state.status is FormSubmitting
          ? const CircularProgressIndicator()
          : ElevatedButton(
              onPressed: () {
                if (_formKey.currentState!.validate()) {
                  context.read<LoginBloc>().add(LoginSubmittedEvent());
                }
              },
              child: const Text('Login'),
            );
    });
  }

void _showSnackbar(BuildContext context, String message) {
  final snackBar = SnackBar(content: Text(message));
  ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
}
  • main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_d21_sosial_media/auth_repository.dart';
import 'package:flutter_d21_sosial_media/login_view.dart';

void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MultiRepositoryProvider(
        providers: [
          RepositoryProvider(create: (context) => AuthRepository())
        ],
        child: LoginView(),
      ),
    );
  }
}

Copyright 2022 M. Fadli Zein

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published