From cfb929afacda543f4b63b37162bc27ffce6bd312 Mon Sep 17 00:00:00 2001 From: Lachfrosch Date: Wed, 8 May 2024 15:57:00 +0200 Subject: [PATCH] Created a basic 5x5 Grid in the UI that randomly changes Color on click --- lib/main.dart | 104 +++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 57 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 8e94089..d0132d0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'dart:math'; import 'package:flutter/material.dart'; void main() { @@ -11,7 +12,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Flutter Demo', + title: 'Bubble-Twist', theme: ThemeData( // This is the theme of your application. // @@ -55,71 +56,60 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } + List> _grid = List.generate(5, (_) => List.generate(5, (_) => Random().nextInt(5))); @override Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. return Scaffold( appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), + title: Text('Candy Crush'), ), body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], + child: GridView.builder( + shrinkWrap: true, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 5, + ), + itemCount: _grid.length * _grid.length, + itemBuilder: (BuildContext context, int index) { + int row = index ~/ _grid.length; + int col = index % _grid.length; + return GestureDetector( + onTap: () => _onTileTap(row, col), + child: Container( + margin: EdgeInsets.all(4), + decoration: BoxDecoration( + color: _getColor(_grid[row][col]), + borderRadius: BorderRadius.circular(8), + ), + ), + ); + }, ), ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. ); } + + Color _getColor(int value) { + switch (value) { + case 0: + return Colors.red; + case 1: + return Colors.blue; + case 2: + return Colors.green; + case 3: + return Colors.yellow; + case 4: + return Colors.orange; + default: + return Colors.white; + } + } + + void _onTileTap(int row, int col) { + setState(() { + _grid[row][col] = Random().nextInt(5); + }); + } }