Skip to content

Instantly share code, notes, and snippets.

@abdullahnettoor
Created March 11, 2022 14:42
Show Gist options
  • Select an option

  • Save abdullahnettoor/afc7ea7ca902044cb8dbe5e42bccd08a to your computer and use it in GitHub Desktop.

Select an option

Save abdullahnettoor/afc7ea7ca902044cb8dbe5e42bccd08a to your computer and use it in GitHub Desktop.
Flutter - Build APK through GitHub Actions
name: Flutter CI
# This workflow is triggered on pushes to the repository.
on:
push:
branches:
- master
# on: push # Default will running for every branch.
jobs:
build:
# This job will run on ubuntu virtual machine
runs-on: ubuntu-latest
steps:
# Setup Java environment in order to build the Android app.
- uses: actions/checkout@v1
- uses: actions/setup-java@v1
with:
java-version: '12.x'
# Setup the flutter environment.
- uses: subosito/flutter-action@v1
with:
channel: 'beta' # 'dev', 'alpha', default to: 'stable'
# flutter-version: '1.12.x' # you can also specify exact version of flutter
# Get flutter dependencies.
- run: flutter pub get
# Check for any formatting issues in the code.
- run: flutter format --set-exit-if-changed .
# Statically analyze the Dart code for any errors.
- run: flutter analyze .
# Run widget tests for our flutter project.
- run: flutter test
# Build apk.
- run: flutter build apk
# Upload generated apk to the artifacts.
- uses: actions/upload-artifact@v1
with:
name: release-apk
path: build/app/outputs/apk/release/app-release.apk
@naninanni8741-cmd

Copy link
Copy Markdown

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

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

class LoanCalcApp extends StatelessWidget {
const LoanCalcApp({super.key});

@OverRide
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Loan Calculator',
theme: ThemeData(
primarySwatch: Colors.blue,
useMaterial3: true,
),
home: const LoanCalculatorHome(),
);
}
}

class LoanCalculatorHome extends StatefulWidget {
const LoanCalculatorHome({super.key});

@OverRide
State createState() => _LoanCalculatorHomeState();
}

class _LoanCalculatorHomeState extends State {
final _formKey = GlobalKey();
final _amountController = TextEditingController();
final _interestController = TextEditingController();
final _tenureController = TextEditingController();

double _monthlyEMI = 0.0;
double _totalInterest = 0.0;
double _totalPayment = 0.0;

void _calculateLoan() {
if (!_formKey.currentState!.validate()) return;

double principal = double.parse(_amountController.text);
double annualInterest = double.parse(_interestController.text);
int months = int.parse(_tenureController.text);

// Monthly interest rate
double monthlyRate = (annualInterest / 12) / 100;

// EMI Calculation Formula: [P x R x (1+R)^N]/[((1+R)^N)-1]
double emi = (principal * monthlyRate * pow(1 + monthlyRate, months)) /
    (pow(1 + monthlyRate, months) - 1);

setState(() {
  _monthlyEMI = emi;
  _totalPayment = emi * months;
  _totalInterest = _totalPayment - principal;
});

}

@OverRide
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Loan EMI Calculator'),
backgroundColor: Colors.blue,
foregroundColor: Colors.white,
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Loan Amount Input
TextFormField(
controller: _amountController,
keyboardType: TextInputType.number,
decoration: const InputDecoration(
labelText: 'Loan Amount ($)',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.attach_money),
),
validator: (value) => value!.isEmpty ? 'Enter loan amount' : null,
),
const SizedBox(height: 16),

          // Interest Rate Input
          TextFormField(
            controller: _interestController,
            keyboardType: const TextInputType.numberWithOptions(decimal: true),
            decoration: const InputDecoration(
              labelText: 'Annual Interest Rate (%)',
              border: OutlineInputBorder(),
              prefixIcon: Icon(Icons.percent),
            ),
            validator: (value) => value!.isEmpty ? 'Enter interest rate' : null,
          ),
          const SizedBox(height: 16),

          // Tenure Input
          TextFormField(
            controller: _tenureController,
            keyboardType: TextInputType.number,
            decoration: const InputDecoration(
              labelText: 'Tenure (Months)',
              border: OutlineInputBorder(),
              prefixIcon: Icon(Icons.calendar_month),
            ),
            validator: (value) => value!.isEmpty ? 'Enter tenure in months' : null,
          ),
          const SizedBox(height: 24),

          // Calculate Button
          ElevatedButton(
            onPressed: _calculateLoan,
            style: ElevatedButton.styleFrom(
              backgroundColor: Colors.blue,
              padding: const EdgeInsets.symmetric(vertical: 16),
            ),
            child: const Text('Calculate', style: TextStyle(fontSize: 18, color: Colors.white)),
          ),
          const SizedBox(height: 32),

          // Results Display Card
          Card(
            elevation: 4,
            color: Colors.blue.shade50,
            child: Padding(
              padding: const EdgeInsets.all(16.0),
              child: Column(
                children: [
                  _resultRow('Monthly EMI:', '\$${_monthlyEMI.toStringAsFixed(2)}', Colors.blue.shade800),
                  const Divider(),
                  _resultRow('Total Interest:', '\$${_totalInterest.toStringAsFixed(2)}', Colors.black87),
                  const Divider(),
                  _resultRow('Total Payment:', '\$${_totalPayment.toStringAsFixed(2)}', Colors.green.shade700),
                ],
              ),
            ),
          ),
        ],
      ),
    ),
  ),
);

}

Widget _resultRow(String title, String value, Color valueColor) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(title, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
Text(value, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: valueColor)),
],
),
);
}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment