// Copyright 2019 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:provider/provider.dart'; import 'package:provider_shopper/common/theme.dart'; import 'package:provider_shopper/models/cart.dart'; import 'package:provider_shopper/models/catalog.dart'; import 'package:provider_shopper/screens/cart.dart'; import 'package:provider_shopper/screens/catalog.dart'; import 'package:provider_shopper/screens/login.dart'; import 'package:window_size/window_size.dart'; void main() { setupWindow(); runApp(const MyApp()); } const double windowWidth = 400; const double windowHeight = 800; void setupWindow() { if (!kIsWeb && (Platform.isWindows || Platform.isLinux || Platform.isMacOS)) { WidgetsFlutterBinding.ensureInitialized(); setWindowTitle('Provider Demo'); setWindowMinSize(const Size(windowWidth, windowHeight)); setWindowMaxSize(const Size(windowWidth, windowHeight)); getCurrentScreen().then((screen) { setWindowFrame(Rect.fromCenter( center: screen!.frame.center, width: windowWidth, height: windowHeight, )); }); } } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { // Using MultiProvider is convenient when providing multiple objects. return MultiProvider( providers: [ // In this sample app, CatalogModel never changes, so a simple Provider // is sufficient. Provider(create: (context) => CatalogModel()), // CartModel is implemented as a ChangeNotifier, which calls for the use // of ChangeNotifierProvider. Moreover, CartModel depends // on CatalogModel, so a ProxyProvider is needed. ChangeNotifierProxyProvider( create: (context) => CartModel(), update: (context, catalog, cart) { if (cart == null) throw ArgumentError.notNull('cart'); cart.catalog = catalog; return cart; }, ), ], child: MaterialApp( title: 'Provider Demo', theme: appTheme, initialRoute: '/', routes: { '/': (context) => const MyLogin(), '/catalog': (context) => const MyCatalog(), '/cart': (context) => const MyCart(), }, ), ); } }