From 4ca1101f45fb80296fcd5863cd1f71e156687756 Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 26 Jan 2023 16:50:28 +0100 Subject: [PATCH 1/8] Added Dynamic List (UDI) --- lib/UserDefinedList.dart | 71 ++++++++++++++++++++++++++++++++++++++-- lib/home.dart | 2 +- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index b9febd5..f4bc895 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -130,8 +130,35 @@ class NewsList extends StatelessWidget { } } -class IssueList extends StatelessWidget { - const IssueList({super.key}); + + + +/*class IssueList extends StatelessWidget { + IssueList({super.key}); + final List _items = []; + + /*void addItem(UserDefinedItem item) { + _items.add(item); + } + + void removeItem(UserDefinedItem item) { + _items.remove(item); + } + + final UserDefinedItem item1 = UserDefinedItem( + title: 'Licht ausgebrannt', + description: 'Licht ist ausgebrannt in der Sebastianstraße', + image: Image.network('https://api.ebsg.at/uploads/immo70/originals/objekt_809_oggau-am-neusiedler-see_7063_6021.jpeg',), + ); + final UserDefinedItem item2 = UserDefinedItem( + title: 'test2', + description: 'Gemeide Amt der Marktgemeinde Oggau. SPÖ regierend', + image: Image.network('https://upload.wikimedia.org/wikipedia/commons/a/a1/Oggau_am_Neusiedler_See_-_Gemeindeamt_%2801%29.jpg'), + ); + + _items.add(item1); + _items.add(item2);*/ + @override Widget build(BuildContext context) { @@ -151,5 +178,45 @@ class IssueList extends StatelessWidget { ], ); } +}*/ + +class IssueList extends StatelessWidget { + final List _items = []; + + IssueList({super.key}); + + void addUDI(UserDefinedItem udi) { + _items.add(udi); + } + + void removeUDI(UserDefinedItem udi) { + _items.remove(udi); + } + + @override + Widget build(BuildContext context) { + final UserDefinedItem item1 = UserDefinedItem( + title: 'Licht ausgebrannt', + description: 'Licht ist ausgebrannt in der Sebastianstraße', + image: Image.network('https://api.ebsg.at/uploads/immo70/originals/objekt_809_oggau-am-neusiedler-see_7063_6021.jpeg',), + ); + final UserDefinedItem item2 = UserDefinedItem( + title: 'test2', + description: 'Gemeide Amt der Marktgemeinde Oggau. SPÖ regierend', + image: Image.network('https://upload.wikimedia.org/wikipedia/commons/a/a1/Oggau_am_Neusiedler_See_-_Gemeindeamt_%2801%29.jpg'), + ); + addUDI(item1); + addUDI(item2); + return ListView( + children: _items.map((item) => UserDefinedItem( + title: item.title, + description: item.description, + image: item.image, + ), + ).toList(), + ); + } } + + diff --git a/lib/home.dart b/lib/home.dart index dbcfa4c..e26721c 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -33,7 +33,7 @@ class _MyHomePageState extends State { Widget build(BuildContext context) { final List widgetOptions = [ const NewsList(), - login ? const IssueList() : const Text( + login ? IssueList() : const Text( 'Mängel (nur für angemeldete Benutzer verfügbar)', style: optionStyle, textAlign: TextAlign.center, From 3e684826078b7c0df4b6ff2b29a80acaca194c5d Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 23 Feb 2023 14:56:34 +0100 Subject: [PATCH 2/8] removed unnecessary code --- lib/home.dart | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/lib/home.dart b/lib/home.dart index 2806320..7435960 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -23,20 +23,6 @@ class _MyHomePageState extends State { _selectedIndex = index; }); } - - 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++; - }); - } - void setLogin(bool value) { setState(() { login = value; From 162fe15141ee84c31909b199f7b43cbd8ed7cdfb Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 23 Feb 2023 16:57:52 +0100 Subject: [PATCH 3/8] Image_picker addet --- lib/AddPage.dart | 158 ++++++++++++++++++++++++++++++++++++++++++++++- pubspec.lock | 90 +++++++++++++++++++++++++++ pubspec.yaml | 1 + 3 files changed, 248 insertions(+), 1 deletion(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 65045c6..761a1b9 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +/*import 'package:flutter/material.dart'; class AddScreen extends StatefulWidget { @override @@ -107,8 +107,164 @@ class _AddScreenState extends State { ), ); } +}*/ + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; + +class AddScreen extends StatefulWidget { + @override + _AddScreenState createState() => _AddScreenState(); } +class _AddScreenState extends State { + final _formKey = GlobalKey(); + final _titleController = TextEditingController(); + final _descriptionController = TextEditingController(); + File? _imageFile; + + Future _getImage(ImageSource source) async { + final pickedFile = await ImagePicker().getImage(source: source); + + if (pickedFile != null) { + setState(() { + _imageFile = File(pickedFile.path); + }); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Neues Element hinzufügen'), + actions: [ + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: IconButton( + icon: Icon(Icons.refresh), + onPressed: () { + _titleController.clear(); + _descriptionController.clear(); + setState(() { + _imageFile = null; + }); + }, + ), + ), + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: IconButton( + icon: Icon(Icons.check), + onPressed: () { + if (_formKey.currentState!.validate()) { + // Hier wird die Logik zum Hinzufügen des neuen Elements ausgeführt + Navigator.pop(context); + } + }, + ), + ), + ], + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + decoration: InputDecoration( + labelText: 'Titel', + filled: true, + fillColor: Colors.grey[200], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16.0), + ), + ), + controller: _titleController, + validator: (value) { + if (value!.isEmpty) { + return 'Bitte geben Sie einen Titel ein.'; + } + return null; + }, + ), + SizedBox(height: 16.0), + TextFormField( + decoration: InputDecoration( + labelText: 'Beschreibung', + filled: true, + fillColor: Colors.grey[200], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16.0), + ), + ), + controller: _descriptionController, + validator: (value) { + if (value!.isEmpty) { + return 'Bitte geben Sie eine Beschreibung ein.'; + } + return null; + }, + ), + SizedBox(height: 16.0), + _imageFile != null + ? Image.file(_imageFile!) + : Container( + height: 150.0, + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(16.0), + ), + child: Center( + child: TextButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (context) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: Icon(Icons.photo_library), + title: Text ('Galerie auswählen'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.gallery); + }, + ), + ListTile( + leading: Icon(Icons.camera_alt), + title: Text('Kamera verwenden'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.camera); + }, + ), + ], + ), + ); + }, + child: Text( + 'Bild hinzufügen', + style: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + + /*import 'package:flutter/material.dart'; class AddScreen extends StatelessWidget { diff --git a/pubspec.lock b/pubspec.lock index e9b9197..eb98ba2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -36,6 +36,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.16.0" + cross_file: + dependency: transitive + description: + name: cross_file + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.3+4" cupertino_icons: dependency: "direct main" description: @@ -62,11 +69,79 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.1" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.5" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.2" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.6+3" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.5+7" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.11" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.6+9" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.6.3" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.4" lints: dependency: transitive description: @@ -102,6 +177,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.4" sky_engine: dependency: transitive description: flutter @@ -149,6 +231,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" vector_math: dependency: transitive description: @@ -158,3 +247,4 @@ packages: version: "2.1.2" sdks: dart: ">=2.18.2 <3.0.0" + flutter: ">=3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 96b0a42..a833461 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 + image_picker: ^0.8.6+3 dev_dependencies: flutter_test: From 3d670d0fd1446e340a820471085cdf44209bcc0e Mon Sep 17 00:00:00 2001 From: Schummi C Date: Wed, 1 Mar 2023 15:09:57 +0100 Subject: [PATCH 4/8] Image_picker addet --- lib/AddPage.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 761a1b9..671609f 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -232,7 +232,7 @@ class _AddScreenState extends State { onTap: () { Navigator.pop(context); _getImage(ImageSource.gallery); - }, + }, // ), ListTile( leading: Icon(Icons.camera_alt), From cd99dd5c343db470ea8fa6d90a0099694cc1faa0 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 2 Mar 2023 15:08:53 +0100 Subject: [PATCH 5/8] =?UTF-8?q?Code=20aufger=C3=A4umt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/AddPage.dart | 277 +++++++++++--------------------------------- lib/DetailPage.dart | 27 ----- 2 files changed, 65 insertions(+), 239 deletions(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 671609f..bd72fea 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -1,4 +1,7 @@ -/*import 'package:flutter/material.dart'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; class AddScreen extends StatefulWidget { @override @@ -9,7 +12,17 @@ class _AddScreenState extends State { final _formKey = GlobalKey(); final _titleController = TextEditingController(); final _descriptionController = TextEditingController(); - final _imageController = TextEditingController(); + File? _imageFile; + + Future _getImage(ImageSource source) async { + final pickedFile = await ImagePicker().getImage(source: source); + + if (pickedFile != null) { + setState(() { + _imageFile = File(pickedFile.path); + }); + } + } @override Widget build(BuildContext context) { @@ -24,7 +37,9 @@ class _AddScreenState extends State { onPressed: () { _titleController.clear(); _descriptionController.clear(); - _imageController.clear(); + setState(() { + _imageFile = null; + }); }, ), ), @@ -84,218 +99,56 @@ class _AddScreenState extends State { }, ), SizedBox(height: 16.0), - TextFormField( - decoration: InputDecoration( - labelText: 'Bild', - filled: true, - fillColor: Colors.grey[200], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16.0), - ), - ), - controller: _imageController, - validator: (value) { - if (value!.isEmpty) { - return 'Bitte geben Sie ein Bild ein.'; - } - return null; - }, - ), + _imageFile != null + ? Image.file(_imageFile!) + : Container( + height: 150.0, + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(16.0), + ), + child: Center( + child: TextButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (context) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: Icon(Icons.photo_library), + title: Text('Galerie auswählen'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.gallery); + }, // + ), + ListTile( + leading: Icon(Icons.camera_alt), + title: Text('Kamera verwenden'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.camera); + }, + ), + ], + ), + ); + }, + child: Text( + 'Bild hinzufügen', + style: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), ], ), ), ), ); } -}*/ - -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:image_picker/image_picker.dart'; - -class AddScreen extends StatefulWidget { - @override - _AddScreenState createState() => _AddScreenState(); -} - -class _AddScreenState extends State { - final _formKey = GlobalKey(); - final _titleController = TextEditingController(); - final _descriptionController = TextEditingController(); - File? _imageFile; - - Future _getImage(ImageSource source) async { - final pickedFile = await ImagePicker().getImage(source: source); - - if (pickedFile != null) { - setState(() { - _imageFile = File(pickedFile.path); - }); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Neues Element hinzufügen'), - actions: [ - Padding( - padding: const EdgeInsets.only(right: 8.0), - child: IconButton( - icon: Icon(Icons.refresh), - onPressed: () { - _titleController.clear(); - _descriptionController.clear(); - setState(() { - _imageFile = null; - }); - }, - ), - ), - Padding( - padding: const EdgeInsets.only(right: 8.0), - child: IconButton( - icon: Icon(Icons.check), - onPressed: () { - if (_formKey.currentState!.validate()) { - // Hier wird die Logik zum Hinzufügen des neuen Elements ausgeführt - Navigator.pop(context); - } - }, - ), - ), - ], - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: Form( - key: _formKey, - child: Column( - children: [ - TextFormField( - decoration: InputDecoration( - labelText: 'Titel', - filled: true, - fillColor: Colors.grey[200], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16.0), - ), - ), - controller: _titleController, - validator: (value) { - if (value!.isEmpty) { - return 'Bitte geben Sie einen Titel ein.'; - } - return null; - }, - ), - SizedBox(height: 16.0), - TextFormField( - decoration: InputDecoration( - labelText: 'Beschreibung', - filled: true, - fillColor: Colors.grey[200], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16.0), - ), - ), - controller: _descriptionController, - validator: (value) { - if (value!.isEmpty) { - return 'Bitte geben Sie eine Beschreibung ein.'; - } - return null; - }, - ), - SizedBox(height: 16.0), - _imageFile != null - ? Image.file(_imageFile!) - : Container( - height: 150.0, - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(16.0), - ), - child: Center( - child: TextButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (context) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: Icon(Icons.photo_library), - title: Text ('Galerie auswählen'), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.gallery); - }, // - ), - ListTile( - leading: Icon(Icons.camera_alt), - title: Text('Kamera verwenden'), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.camera); - }, - ), - ], - ), - ); - }, - child: Text( - 'Bild hinzufügen', - style: TextStyle( - color: Theme.of(context).primaryColor, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ], - ), - ), - ), - ); - } -} - - -/*import 'package:flutter/material.dart'; - -class AddScreen extends StatelessWidget { - const AddScreen({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Neues Element hinzufügen'), - ), - body: Column( - children: [ - TextFormField( - decoration: InputDecoration(labelText: 'Titel'), - ), - TextFormField( - decoration: InputDecoration(labelText: 'Beschreibung'), - ), - TextFormField( - decoration: InputDecoration(labelText: 'Bild'), - ), - ElevatedButton( - onPressed: () { - // Fügen Sie hier die Logik zum Hinzufügen eines neuen Elements hinzu - Navigator.pop(context); - }, - child: Text('Hinzufügen'), - ), - ], - ), - ); - } -}*/ +} \ No newline at end of file diff --git a/lib/DetailPage.dart b/lib/DetailPage.dart index 11b775d..b9c008f 100644 --- a/lib/DetailPage.dart +++ b/lib/DetailPage.dart @@ -46,33 +46,6 @@ class DetailPage extends StatelessWidget { ], ), ), - /* - body: Column( - children: [ - Container( - padding: const EdgeInsets.all(8.0), - child: image, - ), - Container( - padding: const EdgeInsets.all(8.0), - child: Text( - title, - style: const TextStyle( - fontSize: 24, - ), - ), - ), - Container( - padding: const EdgeInsets.all(8.0), - child: Text( - description, - style: const TextStyle( - fontSize: 18, - ), - ), - ), - ], - ),*/ ); } } From dd737fa61a20919b1499fc806e5292db57364294 Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 2 Mar 2023 16:58:43 +0100 Subject: [PATCH 6/8] tried to release issues per form dialog --- android/app/src/main/AndroidManifest.xml | 2 +- lib/AddPage.dart | 277 +++++++++++++++++------ lib/DetailPage.dart | 2 +- lib/UserDefinedList.dart | 12 +- lib/home.dart | 2 +- pubspec.lock | 120 ++++++---- 6 files changed, 298 insertions(+), 117 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0ad5ccc..37c5d95 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ + android:icon="@mipmap/ic_launcher"> { final _formKey = GlobalKey(); final _titleController = TextEditingController(); final _descriptionController = TextEditingController(); - File? _imageFile; - - Future _getImage(ImageSource source) async { - final pickedFile = await ImagePicker().getImage(source: source); - - if (pickedFile != null) { - setState(() { - _imageFile = File(pickedFile.path); - }); - } - } + final _imageController = TextEditingController(); @override Widget build(BuildContext context) { @@ -37,9 +24,7 @@ class _AddScreenState extends State { onPressed: () { _titleController.clear(); _descriptionController.clear(); - setState(() { - _imageFile = null; - }); + _imageController.clear(); }, ), ), @@ -99,56 +84,218 @@ class _AddScreenState extends State { }, ), SizedBox(height: 16.0), - _imageFile != null - ? Image.file(_imageFile!) - : Container( - height: 150.0, - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(16.0), - ), - child: Center( - child: TextButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (context) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: Icon(Icons.photo_library), - title: Text('Galerie auswählen'), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.gallery); - }, // - ), - ListTile( - leading: Icon(Icons.camera_alt), - title: Text('Kamera verwenden'), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.camera); - }, - ), - ], - ), - ); - }, - child: Text( - 'Bild hinzufügen', - style: TextStyle( - color: Theme.of(context).primaryColor, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), + TextFormField( + decoration: InputDecoration( + labelText: 'Bild', + filled: true, + fillColor: Colors.grey[200], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16.0), + ), + ), + controller: _imageController, + validator: (value) { + if (value!.isEmpty) { + return 'Bitte geben Sie ein Bild ein.'; + } + return null; + }, + ), ], ), ), ), ); } -} \ No newline at end of file +}*/ + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; + +class AddScreen extends StatefulWidget { + @override + _AddScreenState createState() => _AddScreenState(); +} + +class _AddScreenState extends State { + final _formKey = GlobalKey(); + final _titleController = TextEditingController(); + final _descriptionController = TextEditingController(); + File? _imageFile; + + Future _getImage(ImageSource source) async { + final pickedFile = await ImagePicker().getImage(source: source); + + if (pickedFile != null) { + setState(() { + _imageFile = File(pickedFile.path); + }); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Neues Element hinzufügen'), + actions: [ + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: IconButton( + icon: Icon(Icons.refresh), + onPressed: () { + _titleController.clear(); + _descriptionController.clear(); + setState(() { + _imageFile = null; + }); + }, + ), + ), + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: IconButton( + icon: Icon(Icons.check), + onPressed: () { + if (_formKey.currentState!.validate()) { + // Hier wird die Logik zum Hinzufügen des neuen Elements ausgeführt + Navigator.pop(context); + } + }, + ), + ), + ], + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: Column( + children: [ + TextFormField( + decoration: InputDecoration( + labelText: 'Titel', + filled: true, + fillColor: Colors.grey[200], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16.0), + ), + ), + controller: _titleController, + validator: (value) { + if (value!.isEmpty) { + return 'Bitte geben Sie einen Titel ein.'; + } + return null; + }, + ), + SizedBox(height: 16.0), + TextFormField( + decoration: InputDecoration( + labelText: 'Beschreibung', + filled: true, + fillColor: Colors.grey[200], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(16.0), + ), + ), + controller: _descriptionController, + validator: (value) { + if (value!.isEmpty) { + return 'Bitte geben Sie eine Beschreibung ein.'; + } + return null; + }, + ), + SizedBox(height: 16.0), + _imageFile != null + ? Image.file(_imageFile!) + : Container( + height: 150.0, + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(16.0), + ), + child: Center( + child: TextButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (context) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: Icon(Icons.photo_library), + title: Text ('Galerie auswählen'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.gallery); + }, // + ), + ListTile( + leading: Icon(Icons.camera_alt), + title: Text('Kamera verwenden'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.camera); + }, + ), + ], + ), + ); + }, + child: Text( + 'Bild hinzufügen', + style: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } +} + + +/*import 'package:flutter/material.dart'; + +class AddScreen extends StatelessWidget { + const AddScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Neues Element hinzufügen'), + ), + body: Column( + children: [ + TextFormField( + decoration: InputDecoration(labelText: 'Titel'), + ), + TextFormField( + decoration: InputDecoration(labelText: 'Beschreibung'), + ), + TextFormField( + decoration: InputDecoration(labelText: 'Bild'), + ), + ElevatedButton( + onPressed: () { + // Fügen Sie hier die Logik zum Hinzufügen eines neuen Elements hinzu + Navigator.pop(context); + }, + child: Text('Hinzufügen'), + ), + ], + ), + ); + } +}*/ diff --git a/lib/DetailPage.dart b/lib/DetailPage.dart index b9c008f..b20e089 100644 --- a/lib/DetailPage.dart +++ b/lib/DetailPage.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class DetailPage extends StatelessWidget { final String title; final String description; - final Image image; + final Image? image; const DetailPage({ super.key, diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index f4bc895..3ceac1f 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -5,12 +5,12 @@ import 'DetailPage.dart'; class UserDefinedItem extends StatelessWidget { final String title; final String description; - final Image image; + final Image? image; const UserDefinedItem({super.key, required this.title, required this.description, - required this.image, + this.image, }); @override @@ -28,7 +28,7 @@ class UserDefinedItem extends StatelessWidget { builder: (context) => DetailPage( title: title, description: description, - image: image, + image: image!= null ? image! : null, ), ), ); @@ -180,6 +180,8 @@ class NewsList extends StatelessWidget { } }*/ +IssueList issueList = IssueList(); + class IssueList extends StatelessWidget { final List _items = []; @@ -205,8 +207,8 @@ class IssueList extends StatelessWidget { description: 'Gemeide Amt der Marktgemeinde Oggau. SPÖ regierend', image: Image.network('https://upload.wikimedia.org/wikipedia/commons/a/a1/Oggau_am_Neusiedler_See_-_Gemeindeamt_%2801%29.jpg'), ); - addUDI(item1); - addUDI(item2); + //addUDI(item1); + //addUDI(item2); return ListView( children: _items.map((item) => UserDefinedItem( title: item.title, diff --git a/lib/home.dart b/lib/home.dart index 7435960..1e7b5b5 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -33,7 +33,7 @@ class _MyHomePageState extends State { Widget build(BuildContext context) { final List widgetOptions = [ const NewsList(), - login ? IssueList() : const Text( + login ? issueList: const Text( 'Mängel (nur für angemeldete Benutzer verfügbar)', style: optionStyle, textAlign: TextAlign.center, diff --git a/pubspec.lock b/pubspec.lock index eb98ba2..b8d192d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,56 +5,64 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" cross_file: dependency: transitive description: name: cross_file - url: "https://pub.dartlang.org" + sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" + url: "https://pub.dev" source: hosted version: "0.3.3+4" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + url: "https://pub.dev" source: hosted version: "1.0.5" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" flutter: @@ -66,14 +74,16 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + url: "https://pub.dev" source: hosted version: "2.0.1" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" + url: "https://pub.dev" source: hosted version: "2.0.8" flutter_test: @@ -90,98 +100,112 @@ packages: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted version: "4.0.2" image_picker: dependency: "direct main" description: name: image_picker - url: "https://pub.dartlang.org" + sha256: "22207768556b82d55ec70166824350fee32298732d5efa4d6e756f848f51f66a" + url: "https://pub.dev" source: hosted version: "0.8.6+3" image_picker_android: dependency: transitive description: name: image_picker_android - url: "https://pub.dartlang.org" + sha256: "68d067baf7f6e401b1124ee83dd6967e67847314250fd68012aab34a69beb344" + url: "https://pub.dev" source: hosted version: "0.8.5+7" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - url: "https://pub.dartlang.org" + sha256: "66fc6e3877bbde82c33d122f3588777c3784ac5bd7d1cdd79213ef7aecb85b34" + url: "https://pub.dev" source: hosted version: "2.1.11" image_picker_ios: dependency: transitive description: name: image_picker_ios - url: "https://pub.dartlang.org" + sha256: "39aa70b5f1e5e7c94585b9738632d5fdb764a5655e40cd9e7b95fbd2fc50c519" + url: "https://pub.dev" source: hosted version: "0.8.6+9" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - url: "https://pub.dartlang.org" + sha256: "1991219d9dbc42a99aff77e663af8ca51ced592cd6685c9485e3458302d3d4f8" + url: "https://pub.dev" source: hosted version: "2.6.3" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" source: hosted version: "2.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + url: "https://pub.dev" source: hosted version: "2.1.4" sky_engine: @@ -193,58 +217,66 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted version: "1.3.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" sdks: dart: ">=2.18.2 <3.0.0" flutter: ">=3.0.0" From 3056a840238e039db5cdf05eb942ed743d1edca6 Mon Sep 17 00:00:00 2001 From: Schummi C Date: Thu, 9 Mar 2023 11:37:48 +0100 Subject: [PATCH 7/8] tried to release issues per form dialog --- lib/AddPage.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index 671609f..a3660fe 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -270,7 +270,7 @@ class _AddScreenState extends State { class AddScreen extends StatelessWidget { const AddScreen({super.key}); - @override + Widget build(BuildContext context) { return Scaffold( appBar: AppBar( From b2df80a7dcf63ac989b72f9eb98e1433eb94da21 Mon Sep 17 00:00:00 2001 From: Nicolas Gruber Date: Thu, 16 Mar 2023 14:50:11 +0100 Subject: [PATCH 8/8] Code cleaned up --- lib/AddPage.dart | 275 +++++++++------------------------------ lib/UserDefinedList.dart | 50 ------- 2 files changed, 64 insertions(+), 261 deletions(-) diff --git a/lib/AddPage.dart b/lib/AddPage.dart index a3660fe..422d66d 100644 --- a/lib/AddPage.dart +++ b/lib/AddPage.dart @@ -1,4 +1,7 @@ -/*import 'package:flutter/material.dart'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; class AddScreen extends StatefulWidget { @override @@ -9,7 +12,17 @@ class _AddScreenState extends State { final _formKey = GlobalKey(); final _titleController = TextEditingController(); final _descriptionController = TextEditingController(); - final _imageController = TextEditingController(); + File? _imageFile; + + Future _getImage(ImageSource source) async { + final pickedFile = await ImagePicker().getImage(source: source); + + if (pickedFile != null) { + setState(() { + _imageFile = File(pickedFile.path); + }); + } + } @override Widget build(BuildContext context) { @@ -24,7 +37,9 @@ class _AddScreenState extends State { onPressed: () { _titleController.clear(); _descriptionController.clear(); - _imageController.clear(); + setState(() { + _imageFile = null; + }); }, ), ), @@ -84,218 +99,56 @@ class _AddScreenState extends State { }, ), SizedBox(height: 16.0), - TextFormField( - decoration: InputDecoration( - labelText: 'Bild', - filled: true, - fillColor: Colors.grey[200], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16.0), - ), - ), - controller: _imageController, - validator: (value) { - if (value!.isEmpty) { - return 'Bitte geben Sie ein Bild ein.'; - } - return null; - }, - ), + _imageFile != null + ? Image.file(_imageFile!) + : Container( + height: 150.0, + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(16.0), + ), + child: Center( + child: TextButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (context) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: Icon(Icons.photo_library), + title: Text('Galerie auswählen'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.gallery); + }, // + ), + ListTile( + leading: Icon(Icons.camera_alt), + title: Text('Kamera verwenden'), + onTap: () { + Navigator.pop(context); + _getImage(ImageSource.camera); + }, + ), + ], + ), + ); + }, + child: Text( + 'Bild hinzufügen', + style: TextStyle( + color: Theme.of(context).primaryColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), ], ), ), ), ); } -}*/ - -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:image_picker/image_picker.dart'; - -class AddScreen extends StatefulWidget { - @override - _AddScreenState createState() => _AddScreenState(); } - -class _AddScreenState extends State { - final _formKey = GlobalKey(); - final _titleController = TextEditingController(); - final _descriptionController = TextEditingController(); - File? _imageFile; - - Future _getImage(ImageSource source) async { - final pickedFile = await ImagePicker().getImage(source: source); - - if (pickedFile != null) { - setState(() { - _imageFile = File(pickedFile.path); - }); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Neues Element hinzufügen'), - actions: [ - Padding( - padding: const EdgeInsets.only(right: 8.0), - child: IconButton( - icon: Icon(Icons.refresh), - onPressed: () { - _titleController.clear(); - _descriptionController.clear(); - setState(() { - _imageFile = null; - }); - }, - ), - ), - Padding( - padding: const EdgeInsets.only(right: 8.0), - child: IconButton( - icon: Icon(Icons.check), - onPressed: () { - if (_formKey.currentState!.validate()) { - // Hier wird die Logik zum Hinzufügen des neuen Elements ausgeführt - Navigator.pop(context); - } - }, - ), - ), - ], - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: Form( - key: _formKey, - child: Column( - children: [ - TextFormField( - decoration: InputDecoration( - labelText: 'Titel', - filled: true, - fillColor: Colors.grey[200], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16.0), - ), - ), - controller: _titleController, - validator: (value) { - if (value!.isEmpty) { - return 'Bitte geben Sie einen Titel ein.'; - } - return null; - }, - ), - SizedBox(height: 16.0), - TextFormField( - decoration: InputDecoration( - labelText: 'Beschreibung', - filled: true, - fillColor: Colors.grey[200], - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(16.0), - ), - ), - controller: _descriptionController, - validator: (value) { - if (value!.isEmpty) { - return 'Bitte geben Sie eine Beschreibung ein.'; - } - return null; - }, - ), - SizedBox(height: 16.0), - _imageFile != null - ? Image.file(_imageFile!) - : Container( - height: 150.0, - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(16.0), - ), - child: Center( - child: TextButton( - onPressed: () { - showModalBottomSheet( - context: context, - builder: (context) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: Icon(Icons.photo_library), - title: Text ('Galerie auswählen'), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.gallery); - }, // - ), - ListTile( - leading: Icon(Icons.camera_alt), - title: Text('Kamera verwenden'), - onTap: () { - Navigator.pop(context); - _getImage(ImageSource.camera); - }, - ), - ], - ), - ); - }, - child: Text( - 'Bild hinzufügen', - style: TextStyle( - color: Theme.of(context).primaryColor, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ), - ], - ), - ), - ), - ); - } -} - - -/*import 'package:flutter/material.dart'; - -class AddScreen extends StatelessWidget { - const AddScreen({super.key}); - - - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Neues Element hinzufügen'), - ), - body: Column( - children: [ - TextFormField( - decoration: InputDecoration(labelText: 'Titel'), - ), - TextFormField( - decoration: InputDecoration(labelText: 'Beschreibung'), - ), - TextFormField( - decoration: InputDecoration(labelText: 'Bild'), - ), - ElevatedButton( - onPressed: () { - // Fügen Sie hier die Logik zum Hinzufügen eines neuen Elements hinzu - Navigator.pop(context); - }, - child: Text('Hinzufügen'), - ), - ], - ), - ); - } -}*/ diff --git a/lib/UserDefinedList.dart b/lib/UserDefinedList.dart index 3ceac1f..2b44801 100644 --- a/lib/UserDefinedList.dart +++ b/lib/UserDefinedList.dart @@ -130,56 +130,6 @@ class NewsList extends StatelessWidget { } } - - - -/*class IssueList extends StatelessWidget { - IssueList({super.key}); - final List _items = []; - - /*void addItem(UserDefinedItem item) { - _items.add(item); - } - - void removeItem(UserDefinedItem item) { - _items.remove(item); - } - - final UserDefinedItem item1 = UserDefinedItem( - title: 'Licht ausgebrannt', - description: 'Licht ist ausgebrannt in der Sebastianstraße', - image: Image.network('https://api.ebsg.at/uploads/immo70/originals/objekt_809_oggau-am-neusiedler-see_7063_6021.jpeg',), - ); - final UserDefinedItem item2 = UserDefinedItem( - title: 'test2', - description: 'Gemeide Amt der Marktgemeinde Oggau. SPÖ regierend', - image: Image.network('https://upload.wikimedia.org/wikipedia/commons/a/a1/Oggau_am_Neusiedler_See_-_Gemeindeamt_%2801%29.jpg'), - ); - - _items.add(item1); - _items.add(item2);*/ - - - @override - Widget build(BuildContext context) { - return ListView( - children: [ - UserDefinedItem( - title: 'Licht ausgebrannt', - description: 'Licht ist ausgebrannt in der Sebastianstraße', - image: Image.network('https://api.ebsg.at/uploads/immo70/originals/objekt_809_oggau-am-neusiedler-see_7063_6021.jpeg',), - ), - UserDefinedItem( - title: 'test2', - description: 'Gemeide Amt der Marktgemeinde Oggau. SPÖ regierend', - image: Image.network('https://upload.wikimedia.org/wikipedia/commons/a/a1/Oggau_am_Neusiedler_See_-_Gemeindeamt_%2801%29.jpg'), - ), - - ], - ); - } -}*/ - IssueList issueList = IssueList(); class IssueList extends StatelessWidget {