255 lines
9.5 KiB
Dart
255 lines
9.5 KiB
Dart
import 'package:auto_size_text/auto_size_text.dart';
|
||
import 'package:cloudtech_calculator/extension.dart';
|
||
import 'package:cloudtech_calculator/theme_model.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||
import 'package:provider/provider.dart';
|
||
|
||
import 'bloc/getcalc_bloc.dart';
|
||
import 'route.dart';
|
||
|
||
void main() => runApp(ChangeNotifierProvider<ThemeModel>(
|
||
create: (BuildContext context) => ThemeModel(), child: MyApp()));
|
||
|
||
class MyApp extends StatelessWidget {
|
||
// This widget is the root of your application.
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return MaterialApp(
|
||
debugShowCheckedModeBanner: false,
|
||
theme: Provider.of<ThemeModel>(context).currentTheme,
|
||
home: MyHomePage(title: 'Калькулятор'),
|
||
);
|
||
}
|
||
}
|
||
|
||
class MyHomePage extends StatelessWidget {
|
||
MyHomePage({Key key, this.title}) : super(key: key);
|
||
final String title;
|
||
final _getCalc = CalcEventBloc();
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Scaffold(
|
||
appBar: AppBar(
|
||
title: Text(title,
|
||
style: TextStyle(color: Theme.of(context).accentColor)),
|
||
shadowColor: const Color(0x00000000),
|
||
actions: <Widget>[
|
||
PopupMenuButton(
|
||
itemBuilder: (context) => [
|
||
const PopupMenuItem(
|
||
value: 1,
|
||
child: Text("Настройки темы"),
|
||
),
|
||
const PopupMenuItem(
|
||
value: 2,
|
||
child: Text("Курс валют"),
|
||
),
|
||
],
|
||
onSelected: (value) {
|
||
if (value == 1) {
|
||
Navigator.push(
|
||
context,
|
||
MaterialPageRoute(builder: (context) => SecondRoute()),
|
||
);
|
||
} else {
|
||
Navigator.push(
|
||
context,
|
||
MaterialPageRoute(builder: (context) => CursState()),
|
||
);
|
||
}
|
||
},
|
||
)
|
||
],
|
||
),
|
||
body: Container(
|
||
color: Theme.of(context).primaryColor,
|
||
child: Padding(
|
||
padding: const EdgeInsets.all(8.0),
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
Expanded(
|
||
child: Align(
|
||
alignment: Alignment.centerRight,
|
||
child: BlocBuilder<CalcEventBloc, CalcEventState>(
|
||
cubit: _getCalc,
|
||
builder: (context, state) {
|
||
if (state is EmptyState) {
|
||
return AutoSizeText(
|
||
"0",
|
||
style: TextStyle(
|
||
fontSize: 70,
|
||
color: Theme.of(context).accentColor),
|
||
maxLines: 1,
|
||
);
|
||
} else if (state is FirstState) {
|
||
return AutoSizeText(
|
||
state.a.toString(),
|
||
style: TextStyle(
|
||
fontSize: 70,
|
||
color: Theme.of(context).accentColor),
|
||
maxLines: 1,
|
||
);
|
||
} else if (state is OperatorState &&
|
||
state.b == null) {
|
||
return AutoSizeText(
|
||
"${state.a}${state.operator.getString()}",
|
||
style: TextStyle(
|
||
fontSize: 70,
|
||
color: Theme.of(context).accentColor),
|
||
maxLines: 1,
|
||
);
|
||
} else if (state is OperatorState &&
|
||
state.b != null) {
|
||
return AutoSizeText(
|
||
"${state.a}${state.operator.getString()}${state.b}.",
|
||
style: TextStyle(
|
||
fontSize: 70,
|
||
color: Theme.of(context).accentColor),
|
||
maxLines: 1,
|
||
);
|
||
} else if (state is SecondState) {
|
||
return AutoSizeText(
|
||
"${state.a}${state.operator.getString()}${state.b}",
|
||
style: TextStyle(
|
||
fontSize: 70,
|
||
color: Theme.of(context).accentColor),
|
||
maxLines: 1,
|
||
);
|
||
} else if (state is ResultState) {
|
||
return AutoSizeText(
|
||
"${state.result}",
|
||
style: TextStyle(
|
||
fontSize: 70,
|
||
color: Theme.of(context).accentColor),
|
||
maxLines: 1,
|
||
);
|
||
}
|
||
|
||
return const SizedBox.shrink();
|
||
}),
|
||
),
|
||
),
|
||
Row(
|
||
children: [
|
||
CallButton(
|
||
text: "±",
|
||
onPressed: () =>
|
||
_getCalc.add(PlusMinusOperationEvent())),
|
||
CallButton(
|
||
text: "%",
|
||
onPressed: () => _getCalc.add(PercentOperationEvent())),
|
||
CallButton(
|
||
text: "⌫",
|
||
onPressed: () =>
|
||
_getCalc.add(BackspaceOperationEvent())),
|
||
CallButton(
|
||
text: "AC",
|
||
onPressed: () =>
|
||
_getCalc.add(ClearAllOperationEvent())),
|
||
],
|
||
),
|
||
Row(
|
||
children: [
|
||
CallButton(
|
||
text: "7",
|
||
onPressed: () => _getCalc.add(NumberEvent(7))),
|
||
CallButton(
|
||
text: "8",
|
||
onPressed: () => _getCalc.add(NumberEvent(8))),
|
||
CallButton(
|
||
text: "9",
|
||
onPressed: () => _getCalc.add(NumberEvent(9))),
|
||
CallButton(
|
||
text: "/",
|
||
onPressed: () =>
|
||
_getCalc.add(DivisionOperationEvent())),
|
||
],
|
||
),
|
||
Row(
|
||
children: [
|
||
CallButton(
|
||
text: "4",
|
||
onPressed: () => _getCalc.add(NumberEvent(4))),
|
||
CallButton(
|
||
text: "5",
|
||
onPressed: () => _getCalc.add(NumberEvent(5))),
|
||
CallButton(
|
||
text: "6",
|
||
onPressed: () => _getCalc.add(NumberEvent(6))),
|
||
CallButton(
|
||
text: "*",
|
||
onPressed: () => _getCalc.add(MultiOperationEvent())),
|
||
],
|
||
),
|
||
Row(
|
||
children: [
|
||
CallButton(
|
||
text: "1",
|
||
onPressed: () => _getCalc.add(NumberEvent(1))),
|
||
CallButton(
|
||
text: "2",
|
||
onPressed: () => _getCalc.add(NumberEvent(2))),
|
||
CallButton(
|
||
text: "3",
|
||
onPressed: () => _getCalc.add(NumberEvent(3))),
|
||
CallButton(
|
||
text: "-",
|
||
onPressed: () => _getCalc.add(MinusOperationEvent())),
|
||
],
|
||
),
|
||
Row(
|
||
children: [
|
||
CallButton(
|
||
text: "0",
|
||
onPressed: () => _getCalc.add(NumberEvent(0))),
|
||
CallButton(
|
||
text: ".",
|
||
onPressed: () => _getCalc.add(PointOperationEvent())),
|
||
CallButton(
|
||
text: "=",
|
||
onPressed: () => _getCalc.add(ResultOperationEvent())),
|
||
CallButton(
|
||
text: "+",
|
||
onPressed: () => _getCalc.add(PlusOperationEvent())),
|
||
],
|
||
),
|
||
],
|
||
),
|
||
),
|
||
));
|
||
}
|
||
}
|
||
|
||
class CallButton extends StatelessWidget {
|
||
final String text;
|
||
final void Function() onPressed;
|
||
const CallButton({@required this.text, @required this.onPressed});
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Expanded(
|
||
child: Padding(
|
||
padding: const EdgeInsets.all(2.0),
|
||
child: Container(
|
||
clipBehavior: Clip.antiAlias,
|
||
width: 100,
|
||
decoration: BoxDecoration(
|
||
borderRadius: BorderRadius.circular(12),
|
||
color: const Color(0x00000000)),
|
||
child: FlatButton(
|
||
height: 60,
|
||
onPressed: () => onPressed(),
|
||
child: Text(
|
||
text,
|
||
style:
|
||
TextStyle(fontSize: 30, color: Theme.of(context).accentColor),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
);
|
||
}
|
||
}
|