mirror of
https://github.com/nisrulz/flutter-examples.git
synced 2026-08-25 01:05:36 +00:00
- Bump all apps to sdk >=3.0.0 <4.0.0 and add flutter_lints + a shared analysis_options.yaml to every app (flutter analyze is now green repo-wide) - Fix real compile errors in firebase_google_authentication and image_editor, plus deprecated APIs (Matrix4, SvgPicture.color, textScaleFactor), missing async 'mounted' guards, and misc lints via dart fix + manual fixes - Align pubspec 'name' with each folder and Android namespace/applicationId with the documented github.nisrulz.* convention - Convert bmi_calculator from a legacy Flutter module to a standard app with a proper android/ scaffold; fix missing android:exported in launcher manifests across 22 apps so all Android builds pass - Untrack generated build files (GeneratedPluginRegistrant, .flutter-plugins-dependencies) and ignore them
115 lines
3.1 KiB
Dart
115 lines
3.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:intl/intl.dart';
|
|
|
|
class NewTransaction extends StatefulWidget {
|
|
final Function addTx;
|
|
|
|
const NewTransaction(this.addTx, {super.key});
|
|
|
|
@override
|
|
_NewTransactionState createState() => _NewTransactionState();
|
|
}
|
|
|
|
class _NewTransactionState extends State<NewTransaction> {
|
|
final _titleController = TextEditingController();
|
|
final _amountController = TextEditingController();
|
|
DateTime? _selectedDate;
|
|
|
|
void _submitData() {
|
|
if (_amountController.text.isEmpty) {
|
|
return;
|
|
}
|
|
final enteredTitle = _titleController.text;
|
|
final enteredAmount = double.parse(_amountController.text);
|
|
|
|
if (enteredTitle.isEmpty || enteredAmount <= 0 || _selectedDate == null) {
|
|
return;
|
|
}
|
|
|
|
widget.addTx(
|
|
enteredTitle,
|
|
enteredAmount,
|
|
_selectedDate!,
|
|
);
|
|
|
|
Navigator.of(context).pop();
|
|
}
|
|
|
|
void _presentDatePicker() {
|
|
showDatePicker(
|
|
context: context,
|
|
initialDate: DateTime.now(),
|
|
firstDate: DateTime(2019),
|
|
lastDate: DateTime.now(),
|
|
).then((pickedDate) {
|
|
if (pickedDate == null) {
|
|
return;
|
|
}
|
|
setState(() {
|
|
_selectedDate = pickedDate;
|
|
});
|
|
});
|
|
print('...');
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Card(
|
|
elevation: 5,
|
|
child: Container(
|
|
padding: EdgeInsets.all(10),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.end,
|
|
children: <Widget>[
|
|
TextField(
|
|
decoration: InputDecoration(labelText: 'Title'),
|
|
controller: _titleController,
|
|
onSubmitted: (_) => _submitData(),
|
|
),
|
|
TextField(
|
|
decoration: InputDecoration(labelText: 'Amount'),
|
|
controller: _amountController,
|
|
keyboardType: TextInputType.number,
|
|
onSubmitted: (_) => _submitData(),
|
|
),
|
|
SizedBox(
|
|
height: 70,
|
|
child: Row(
|
|
children: <Widget>[
|
|
Expanded(
|
|
child: Text(
|
|
_selectedDate == null
|
|
? 'No Date Chosen!'
|
|
: 'Picked Date: ${DateFormat.yMd().format(_selectedDate!)}',
|
|
),
|
|
),
|
|
TextButton(
|
|
onPressed: _presentDatePicker,
|
|
style: TextButton.styleFrom(
|
|
foregroundColor: Theme.of(context).primaryColor,
|
|
),
|
|
child: Text(
|
|
'Choose Date',
|
|
style: TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
ElevatedButton(
|
|
onPressed: _submitData,
|
|
style: ElevatedButton.styleFrom(
|
|
backgroundColor: Theme.of(context).primaryColor,
|
|
foregroundColor: Theme.of(context).textTheme.labelLarge?.color,
|
|
),
|
|
child: Text('Add Transaction'),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|