// Copyright 2014 The Flutter Authors. 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';
import 'package:flutter/services.dart';

void main() async {
  runApp(const ResizeApp());
}

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

  static const double resizeBy = 10.0;
  static const Key heightLabel = Key('height label');
  static const Key widthLabel = Key('width label');
  static const Key extendedFab = Key('extended FAB');

  static const MethodChannel platform =
    MethodChannel('samples.flutter.dev/resize');

  static Future<void> resize(Size size) async {
    await ResizeApp.platform.invokeMethod<void>(
      'resize',
      <String, dynamic>{
        'width': size.width,
        'height': size.height,
      }
    );
  }

  @override
  State<ResizeApp> createState() => _ResizeAppState();
}

class _ResizeAppState extends State<ResizeApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Builder(
        builder: (BuildContext context) {
          final Size currentSize = MediaQuery.of(context).size;
          return Scaffold(
            floatingActionButton: FloatingActionButton.extended(
              key: ResizeApp.extendedFab,
              label: const Text('Resize'),
              onPressed: () {
                final Size nextSize = Size(
                  currentSize.width + ResizeApp.resizeBy,
                  currentSize.height + ResizeApp.resizeBy,
                );
                ResizeApp.resize(nextSize);
              },
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(
                    key: ResizeApp.widthLabel,
                    'width: ${currentSize.width}'
                  ),
                  Text(
                    key: ResizeApp.heightLabel,
                    'height: ${currentSize.height}',
                  ),
                ],
              ),
            ),
          );
        }
      ),
    );
  }
}
