Update CI project list (#1583)

pull/1585/head
Brett Morgan 1 year ago committed by GitHub
parent 6bd2d930bb
commit be309ecc07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -80,8 +80,7 @@ class _MyContextMenuRegionState extends State<_MyContextMenuRegion> {
@override
Widget build(BuildContext context) {
return ContextMenuRegion(
contextMenuBuilder: (context, primaryAnchor,
[secondaryAnchor]) {
contextMenuBuilder: (context, primaryAnchor, [secondaryAnchor]) {
return _MyCascadingContextMenu(
anchor: primaryAnchor,
showingMessage: _showMessage,

@ -51,15 +51,14 @@ class CustomButtonsPage extends StatelessWidget {
controller: _controller,
maxLines: 4,
minLines: 2,
contextMenuBuilder:
(context, editableTextState) {
contextMenuBuilder: (context, editableTextState) {
return AdaptiveTextSelectionToolbar(
anchors: editableTextState.contextMenuAnchors,
// Build the default buttons, but make them look custom.
// Note that in a real project you may want to build
// different buttons depending on the platform.
children: editableTextState.contextMenuButtonItems
.map((buttonItem) {
children:
editableTextState.contextMenuButtonItems.map((buttonItem) {
return CupertinoButton(
borderRadius: null,
color: const Color(0xffaaaa00),

@ -6,9 +6,9 @@ import 'platform_selector.dart';
class CustomMenuPage extends StatelessWidget {
CustomMenuPage({
Key? key,
super.key,
required this.onChangedPlatform,
}) : super(key: key);
});
static const String route = 'custom-menu';
static const String title = 'Custom Menu';
@ -49,8 +49,7 @@ class CustomMenuPage extends StatelessWidget {
controller: _controller,
maxLines: 4,
minLines: 2,
contextMenuBuilder:
(BuildContext context, EditableTextState editableTextState) {
contextMenuBuilder: (context, editableTextState) {
return _MyContextMenu(
anchor: editableTextState.contextMenuAnchors.primaryAnchor,
children: AdaptiveTextSelectionToolbar.getAdaptiveButtons(

@ -84,8 +84,7 @@ class DefaultValuesPage extends StatelessWidget {
maxLines: 2,
minLines: 2,
controller: _controllerCustom,
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
return AdaptiveTextSelectionToolbar.buttonItems(
anchors: editableTextState.contextMenuAnchors,
buttonItems: <ContextMenuButtonItem>[

@ -63,8 +63,7 @@ class EmailButtonPage extends StatelessWidget {
TextField(
maxLines: 2,
controller: _controller,
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
final TextEditingValue value =
editableTextState.textEditingValue;
final List<ContextMenuButtonItem> buttonItems =

@ -82,8 +82,7 @@ class FieldTypesPage extends StatelessWidget {
CupertinoTextField(
maxLines: 3,
controller: _cupertinoControllerFixed,
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
return AdaptiveTextSelectionToolbar.editableText(
editableTextState: editableTextState,
);
@ -93,8 +92,7 @@ class FieldTypesPage extends StatelessWidget {
CupertinoTextField(
maxLines: 3,
controller: _cupertinoControllerForced,
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
return DesktopTextSelectionToolbar(
anchor: editableTextState.contextMenuAnchors.primaryAnchor,
children: AdaptiveTextSelectionToolbar.getAdaptiveButtons(
@ -118,8 +116,7 @@ class FieldTypesPage extends StatelessWidget {
// EditableText has no built-in gesture detection for
// selection. A wrapper would have to implement
// TextSelectionGestureDetectorBuilderDelegate, etc.
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
return AdaptiveTextSelectionToolbar.editableText(
editableTextState: editableTextState,
);

@ -107,8 +107,7 @@ class FullPage extends StatelessWidget {
Container(height: 20.0),
TextField(
controller: _controller,
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
final TextEditingValue value =
editableTextState.textEditingValue;
final List<ContextMenuButtonItem> buttonItems =
@ -130,8 +129,7 @@ class FullPage extends StatelessWidget {
// Build the default buttons, but make them look crazy.
// Note that in a real project you may want to build
// different buttons depending on the platform.
children:
buttonItems.map((buttonItem) {
children: buttonItems.map((buttonItem) {
return CupertinoButton(
borderRadius: null,
color: const Color(0xffaaaa00),

@ -24,8 +24,7 @@ class GlobalSelectionPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SelectionArea(
contextMenuBuilder:
(context, selectableRegionState) {
contextMenuBuilder: (context, selectableRegionState) {
return AdaptiveTextSelectionToolbar.buttonItems(
anchors: selectableRegionState.contextMenuAnchors,
buttonItems: <ContextMenuButtonItem>[

@ -46,8 +46,7 @@ class _MyAppState extends State<MyApp> {
),
initialRoute: '/',
routes: <String, Widget Function(BuildContext)>{
'/': (context) =>
MyHomePage(onChangedPlatform: onChangedPlatform),
'/': (context) => MyHomePage(onChangedPlatform: onChangedPlatform),
AnywherePage.route: (context) =>
AnywherePage(onChangedPlatform: onChangedPlatform),
CustomButtonsPage.route: (context) =>

@ -63,8 +63,7 @@ class ModifiedActionPage extends StatelessWidget {
),
TextField(
controller: _controller,
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
final List<ContextMenuButtonItem> buttonItems =
editableTextState.contextMenuButtonItems;
// Modify the copy buttonItem to show a dialog after copying.

@ -60,8 +60,7 @@ class ReorderedButtonsPage extends StatelessWidget {
TextField(
controller: _controllerReordered,
maxLines: 2,
contextMenuBuilder: (context,
editableTextState) {
contextMenuBuilder: (context, editableTextState) {
// Reorder the button datas by type.
final HashMap<ContextMenuButtonType, ContextMenuButtonItem>
buttonItemsMap =

@ -6,8 +6,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Can show and use the cascading menu',
(tester) async {
testWidgets('Can show and use the cascading menu', (tester) async {
await tester.pumpWidget(const MyApp());
// Navigate to the CascadingMenuPage example.

@ -1,15 +1,13 @@
import 'package:context_menus/custom_menu_page.dart';
import 'package:context_menus/main.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:context_menus/main.dart';
import 'package:context_menus/custom_menu_page.dart';
void main() {
testWidgets('Shows default buttons in a custom context menu',
(WidgetTester tester) async {
testWidgets('Shows default buttons in a custom context menu', (tester) async {
await tester.pumpWidget(const MyApp());
// Navigate to the CustomMenuPage example.

@ -10,108 +10,111 @@ import 'package:flutter_test/flutter_test.dart';
import 'utils.dart';
void main() {
testWidgets('Selecting the email address shows a custom button',
(tester) async {
await tester.pumpWidget(const MyApp());
testWidgets(
'Selecting the email address shows a custom button',
(tester) async {
await tester.pumpWidget(const MyApp());
// Navigate to the EmailButtonPage example.
await tester.dragUntilVisible(
find.text(EmailButtonPage.title),
find.byType(ListView),
const Offset(0.0, -200.0),
);
await tester.tap(find.text(EmailButtonPage.title));
await tester.pumpAndSettle();
// Navigate to the EmailButtonPage example.
await tester.dragUntilVisible(
find.text(EmailButtonPage.title),
find.byType(ListView),
const Offset(0.0, -200.0),
);
await tester.tap(find.text(EmailButtonPage.title));
await tester.pumpAndSettle();
// Select the first word, then right click to show the context menu.
expect(find.byType(TextField), findsOneWidget);
await tester.tapAt(tester.getTopLeft(find.byType(EditableText)));
await tester.pumpAndSettle();
await tester.sendKeyDownEvent(LogicalKeyboardKey.shift);
for (int i = 0; i < 6; i++) {
await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight);
}
await tester.sendKeyUpEvent(LogicalKeyboardKey.shift);
await tester.pumpAndSettle();
final TestGesture gesture1 = await tester.startGesture(
textOffsetToPosition(tester, 4),
kind: PointerDeviceKind.mouse,
buttons: kSecondaryMouseButton,
);
await tester.pump();
await gesture1.up();
await gesture1.removePointer();
await tester.pumpAndSettle();
// Select the first word, then right click to show the context menu.
expect(find.byType(TextField), findsOneWidget);
await tester.tapAt(tester.getTopLeft(find.byType(EditableText)));
await tester.pumpAndSettle();
await tester.sendKeyDownEvent(LogicalKeyboardKey.shift);
for (int i = 0; i < 6; i++) {
await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight);
}
await tester.sendKeyUpEvent(LogicalKeyboardKey.shift);
await tester.pumpAndSettle();
final TestGesture gesture1 = await tester.startGesture(
textOffsetToPosition(tester, 4),
kind: PointerDeviceKind.mouse,
buttons: kSecondaryMouseButton,
);
await tester.pump();
await gesture1.up();
await gesture1.removePointer();
await tester.pumpAndSettle();
// The context menu is shown, but no email button appears.
expect(find.byType(AdaptiveTextSelectionToolbar), findsOneWidget);
expect(find.text('Send email'), findsNothing);
switch (defaultTargetPlatform) {
case TargetPlatform.iOS:
expect(
find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(2));
break;
case TargetPlatform.macOS:
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton),
findsNWidgets(2));
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
expect(find.byType(TextSelectionToolbarTextButton), findsNWidgets(3));
break;
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(
find.byType(DesktopTextSelectionToolbarButton), findsNWidgets(3));
break;
}
// The context menu is shown, but no email button appears.
expect(find.byType(AdaptiveTextSelectionToolbar), findsOneWidget);
expect(find.text('Send email'), findsNothing);
switch (defaultTargetPlatform) {
case TargetPlatform.iOS:
expect(find.byType(CupertinoTextSelectionToolbarButton),
findsNWidgets(2));
break;
case TargetPlatform.macOS:
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton),
findsNWidgets(2));
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
expect(find.byType(TextSelectionToolbarTextButton), findsNWidgets(3));
break;
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(
find.byType(DesktopTextSelectionToolbarButton), findsNWidgets(3));
break;
}
// Click on "Copy" to hide the context menu.
await tester.tap(find.text('Copy'));
await tester.pumpAndSettle();
expect(find.byType(AdaptiveTextSelectionToolbar), findsNothing);
// Click on "Copy" to hide the context menu.
await tester.tap(find.text('Copy'));
await tester.pumpAndSettle();
expect(find.byType(AdaptiveTextSelectionToolbar), findsNothing);
// Select the email address, then right click it to show the context menu.
for (int i = 0; i < 38; i++) {
await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight);
}
await tester.pumpAndSettle();
await tester.sendKeyDownEvent(LogicalKeyboardKey.shift);
for (int i = 0; i < 15; i++) {
await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight);
}
await tester.sendKeyUpEvent(LogicalKeyboardKey.shift);
final TestGesture gesture2 = await tester.startGesture(
textOffsetToPosition(tester, 48),
kind: PointerDeviceKind.mouse,
buttons: kSecondaryMouseButton,
);
await tester.pump();
await gesture2.up();
await gesture2.removePointer();
await tester.pumpAndSettle();
// Select the email address, then right click it to show the context menu.
for (int i = 0; i < 38; i++) {
await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight);
}
await tester.pumpAndSettle();
await tester.sendKeyDownEvent(LogicalKeyboardKey.shift);
for (int i = 0; i < 15; i++) {
await tester.sendKeyEvent(LogicalKeyboardKey.arrowRight);
}
await tester.sendKeyUpEvent(LogicalKeyboardKey.shift);
final TestGesture gesture2 = await tester.startGesture(
textOffsetToPosition(tester, 48),
kind: PointerDeviceKind.mouse,
buttons: kSecondaryMouseButton,
);
await tester.pump();
await gesture2.up();
await gesture2.removePointer();
await tester.pumpAndSettle();
// The context menu is shown, and the email button now appears.
expect(find.byType(AdaptiveTextSelectionToolbar), findsOneWidget);
expect(find.text('Send email'), findsOneWidget);
switch (defaultTargetPlatform) {
case TargetPlatform.iOS:
expect(
find.byType(CupertinoTextSelectionToolbarButton), findsNWidgets(3));
break;
case TargetPlatform.macOS:
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton),
findsNWidgets(3));
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
expect(find.byType(TextSelectionToolbarTextButton), findsNWidgets(4));
break;
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(
find.byType(DesktopTextSelectionToolbarButton), findsNWidgets(4));
break;
}
});
// The context menu is shown, and the email button now appears.
expect(find.byType(AdaptiveTextSelectionToolbar), findsOneWidget);
expect(find.text('Send email'), findsOneWidget);
switch (defaultTargetPlatform) {
case TargetPlatform.iOS:
expect(find.byType(CupertinoTextSelectionToolbarButton),
findsNWidgets(3));
break;
case TargetPlatform.macOS:
expect(find.byType(CupertinoDesktopTextSelectionToolbarButton),
findsNWidgets(3));
break;
case TargetPlatform.android:
case TargetPlatform.fuchsia:
expect(find.byType(TextSelectionToolbarTextButton), findsNWidgets(4));
break;
case TargetPlatform.linux:
case TargetPlatform.windows:
expect(
find.byType(DesktopTextSelectionToolbarButton), findsNWidgets(4));
break;
}
},
skip: true, // TODO(justinmc): Make this test pass and re-enable.
);
}

@ -1,33 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
void main() {
runApp(
const CalculatorApp(),
);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,37 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:window_size/window_size.dart';
void main() {
runApp(
const CalculatorApp(),
);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,42 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const CalculatorApp(),
);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,43 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const CalculatorApp(),
);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,45 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,48 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,50 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
final String buffer;
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,51 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
final String buffer;
final String error;
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,56 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
this.buffer,
this.error,
});
final String buffer;
final String error;
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,56 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,65 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,67 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,69 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine(CalculatorState state) : super(state);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,75 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,77 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {}
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,82 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,86 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends StatelessWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,86 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,86 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,88 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
'Hello GDSC!',
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,88 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: const Center(
child: Text(
state.buffer,
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,88 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: Center(
child: Text(
state.buffer,
style: TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,88 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: Center(
child: Text(
state.buffer,
style: const TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,89 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: Center(
child: Text(
state.buffer,
style: const TextStyle(fontSize: 40),
),
),
),
),
);
}
}

@ -1,91 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
children: [
Text(
state.buffer,
style: const TextStyle(fontSize: 40),
),
],
),
),
),
);
}
}

@ -1,93 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
columnSizes: [1.fr],
rowSizes: [1.fr],
children: [
Text(
state.buffer,
style: const TextStyle(fontSize: 40),
),
],
),
),
),
);
}
}

@ -1,106 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
Text(
state.buffer,
style: const TextStyle(fontSize: 40),
),
],
),
),
),
);
}
}

@ -1,109 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: Text(
state.buffer,
style: const TextStyle(fontSize: 40),
),
),
],
),
),
),
);
}
}

@ -1,110 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 40),
),
),
],
),
),
),
);
}
}

@ -1,112 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 40),
),
),
),
],
),
),
),
);
}
}

@ -1,112 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 40),
),
),
),
],
),
),
),
);
}
}

@ -1,112 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}

@ -1,114 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {}

@ -1,120 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
// TODO: implement build
throw UnimplementedError();
}
}

@ -1,119 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton();
}
}

@ -1,121 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
child: null,
);
}
}

@ -1,122 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () {},
child: null,
);
}
}

@ -1,122 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () {},
child: Text(),
);
}
}

@ -1,124 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () {},
child: Text(),
);
}
}

@ -1,124 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () {},
child: Text(label),
);
}
}

@ -1,129 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.label,
}) : super(key: key);
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () {},
child: Text(label),
);
}
}

@ -1,131 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.label,
}) : super(key: key);
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () {},
child: Text(label),
);
}
}

@ -1,132 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () {},
child: Text(label),
);
}
}

@ -1,133 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,135 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {}
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,139 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,145 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,147 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,153 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,158 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,163 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,168 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,173 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,178 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,183 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,188 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,193 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,198 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,203 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,208 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,217 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
);
}
}

@ -1,219 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox(
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
),
);
}
}

@ -1,219 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox.expand(
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
),
);
}
}

@ -1,222 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(label),
),
),
);
}
}

@ -1,225 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,227 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,228 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,229 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,233 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: OutlinedButton(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,233 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,234 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,235 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,236 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,237 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,239 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,240 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,241 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,242 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,243 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,244 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
mode: CalculatorEngineMode.result,
error: '',
),
);
void addToBuffer(String str) {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,252 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
mode: CalculatorEngineMode.result,
error: '',
),
);
void addToBuffer(String str) {
if (state.mode == CalculatorEngineMode.result) {
state = state.copyWith(
buffer: str,
mode: CalculatorEngineMode.input,
error: '',
);
} else {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display
seven eight nine
four five six
one two three
zero point equals
''',
columnSizes: [1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,252 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
mode: CalculatorEngineMode.result,
error: '',
),
);
void addToBuffer(String str) {
if (state.mode == CalculatorEngineMode.result) {
state = state.copyWith(
buffer: str,
mode: CalculatorEngineMode.input,
error: '',
);
} else {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display display
seven eight nine divide
four five six multiply
one two three minus
zero point equals plus
''',
columnSizes: [1.fr, 1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,257 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
mode: CalculatorEngineMode.result,
error: '',
),
);
void addToBuffer(String str) {
if (state.mode == CalculatorEngineMode.result) {
state = state.copyWith(
buffer: str,
mode: CalculatorEngineMode.input,
error: '',
);
} else {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
ButtonDefinition(
areaName: 'plus',
op: (engine) => engine.addToBuffer('+'),
label: '+',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display display
seven eight nine divide
four five six multiply
one two three minus
zero point equals plus
''',
columnSizes: [1.fr, 1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,262 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
mode: CalculatorEngineMode.result,
error: '',
),
);
void addToBuffer(String str) {
if (state.mode == CalculatorEngineMode.result) {
state = state.copyWith(
buffer: str,
mode: CalculatorEngineMode.input,
error: '',
);
} else {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
ButtonDefinition(
areaName: 'plus',
op: (engine) => engine.addToBuffer('+'),
label: '+',
),
ButtonDefinition(
areaName: 'minus',
op: (engine) => engine.addToBuffer('-'),
label: '-',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display display
seven eight nine divide
four five six multiply
one two three minus
zero point equals plus
''',
columnSizes: [1.fr, 1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,267 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
mode: CalculatorEngineMode.result,
error: '',
),
);
void addToBuffer(String str) {
if (state.mode == CalculatorEngineMode.result) {
state = state.copyWith(
buffer: str,
mode: CalculatorEngineMode.input,
error: '',
);
} else {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
ButtonDefinition(
areaName: 'plus',
op: (engine) => engine.addToBuffer('+'),
label: '+',
),
ButtonDefinition(
areaName: 'minus',
op: (engine) => engine.addToBuffer('-'),
label: '-',
),
ButtonDefinition(
areaName: 'multiply',
op: (engine) => engine.addToBuffer('*'),
label: '*',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display display
seven eight nine divide
four five six multiply
one two three minus
zero point equals plus
''',
columnSizes: [1.fr, 1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

@ -1,272 +0,0 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_layout_grid/flutter_layout_grid.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:window_size/window_size.dart';
void main() {
if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) {
WidgetsFlutterBinding.ensureInitialized();
setWindowTitle('Simplistic Calculator');
}
runApp(
const ProviderScope(
child: CalculatorApp(),
),
);
}
@immutable
class CalculatorState {
const CalculatorState({
required this.buffer,
required this.mode,
required this.error,
});
final String buffer;
final CalculatorEngineMode mode;
final String error;
CalculatorState copyWith({
String? buffer,
CalculatorEngineMode? mode,
String? error,
}) =>
CalculatorState(
buffer: buffer ?? this.buffer,
mode: mode ?? this.mode,
error: error ?? this.error,
);
}
enum CalculatorEngineMode { input, result }
class CalculatorEngine extends StateNotifier<CalculatorState> {
CalculatorEngine()
: super(
const CalculatorState(
buffer: '0',
mode: CalculatorEngineMode.result,
error: '',
),
);
void addToBuffer(String str) {
if (state.mode == CalculatorEngineMode.result) {
state = state.copyWith(
buffer: str,
mode: CalculatorEngineMode.input,
error: '',
);
} else {
state = state.copyWith(
buffer: state.buffer + str,
error: '',
);
}
}
}
final calculatorStateProvider =
StateNotifierProvider<CalculatorEngine, CalculatorState>(
(_) => CalculatorEngine());
class ButtonDefinition {
const ButtonDefinition({
required this.areaName,
required this.label,
required this.op,
this.type = CalcButtonType.outlined,
});
final String areaName;
final String label;
final CalculatorEngineCallback op;
final CalcButtonType type;
}
final buttonDefinitions = <ButtonDefinition>[
ButtonDefinition(
areaName: 'seven',
op: (engine) => engine.addToBuffer('7'),
label: '7',
),
ButtonDefinition(
areaName: 'eight',
op: (engine) => engine.addToBuffer('8'),
label: '8',
),
ButtonDefinition(
areaName: 'nine',
op: (engine) => engine.addToBuffer('9'),
label: '9',
),
ButtonDefinition(
areaName: 'four',
op: (engine) => engine.addToBuffer('4'),
label: '4',
),
ButtonDefinition(
areaName: 'five',
op: (engine) => engine.addToBuffer('5'),
label: '5',
),
ButtonDefinition(
areaName: 'six',
op: (engine) => engine.addToBuffer('6'),
label: '6',
),
ButtonDefinition(
areaName: 'one',
op: (engine) => engine.addToBuffer('1'),
label: '1',
),
ButtonDefinition(
areaName: 'two',
op: (engine) => engine.addToBuffer('2'),
label: '2',
),
ButtonDefinition(
areaName: 'three',
op: (engine) => engine.addToBuffer('3'),
label: '3',
),
ButtonDefinition(
areaName: 'zero',
op: (engine) => engine.addToBuffer('0'),
label: '0',
),
ButtonDefinition(
areaName: 'point',
op: (engine) => engine.addToBuffer('.'),
label: '.',
),
ButtonDefinition(
areaName: 'equals',
op: (engine) {},
label: '=',
type: CalcButtonType.elevated,
),
ButtonDefinition(
areaName: 'plus',
op: (engine) => engine.addToBuffer('+'),
label: '+',
),
ButtonDefinition(
areaName: 'minus',
op: (engine) => engine.addToBuffer('-'),
label: '-',
),
ButtonDefinition(
areaName: 'multiply',
op: (engine) => engine.addToBuffer('*'),
label: '*',
),
ButtonDefinition(
areaName: 'divide',
op: (engine) => engine.addToBuffer('/'),
label: '/',
),
];
class CalculatorApp extends ConsumerWidget {
const CalculatorApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(calculatorStateProvider);
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Container(
color: Colors.white,
child: LayoutGrid(
areas: '''
display display display display
seven eight nine divide
four five six multiply
one two three minus
zero point equals plus
''',
columnSizes: [1.fr, 1.fr, 1.fr, 1.fr],
rowSizes: [
1.fr,
1.fr,
1.fr,
1.fr,
1.fr,
],
children: [
NamedAreaGridPlacement(
areaName: 'display',
child: SizedBox.expand(
child: Text(
state.buffer,
textAlign: TextAlign.end,
style: const TextStyle(fontSize: 80),
),
),
),
...buttonDefinitions.map(
(definition) => NamedAreaGridPlacement(
areaName: definition.areaName,
child: CalcButton(
label: definition.label,
op: definition.op,
type: definition.type,
),
),
),
],
),
),
),
);
}
}
typedef CalculatorEngineCallback = void Function(CalculatorEngine engine);
enum CalcButtonType { outlined, elevated }
class CalcButton extends ConsumerWidget {
const CalcButton({
Key? key,
required this.op,
required this.label,
required this.type,
}) : super(key: key);
final CalculatorEngineCallback op;
final String label;
final CalcButtonType type;
@override
Widget build(BuildContext context, WidgetRef ref) {
final buttonConstructor = type == CalcButtonType.elevated
? ElevatedButton.new
: OutlinedButton.new;
return SizedBox.expand(
child: Padding(
padding: const EdgeInsets.all(8),
child: buttonConstructor(
onPressed: () => op(ref.read(calculatorStateProvider.notifier)),
child: Text(
label,
style: const TextStyle(fontSize: 40, color: Colors.black54),
),
),
),
);
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save