<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://mis.martin-simunek.cz/skins/common/feed.css?301"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
		<id>http://mis.martin-simunek.cz/index.php?feed=atom&amp;namespace=0&amp;title=Speci%C3%A1ln%C3%AD%3ANov%C3%A9_str%C3%A1nky</id>
		<title>MiS - Nejnovější stránky [cs]</title>
		<link rel="self" type="application/atom+xml" href="http://mis.martin-simunek.cz/index.php?feed=atom&amp;namespace=0&amp;title=Speci%C3%A1ln%C3%AD%3ANov%C3%A9_str%C3%A1nky"/>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Speci%C3%A1ln%C3%AD:Nov%C3%A9_str%C3%A1nky"/>
		<updated>2026-04-18T20:19:08Z</updated>
		<subtitle>Z MiS</subtitle>
		<generator>MediaWiki 1.17.0</generator>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky</id>
		<title>Síťové útoky</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/S%C3%AD%C5%A5ov%C3%A9_%C3%BAtoky"/>
				<updated>2026-02-20T10:43:37Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* 6. Malware šířený sítí */ Oprava nadpisu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DoS / DDoS útok (Denial of Service) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Způsobit nedostupnost síťového prostředku (typicky webového serveru či připojení k&amp;amp;nbsp;internetu).&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Útočník si vytvoří nebo pronajme botnet (síť napadených počítačů).&lt;br /&gt;
#* Každé zařízení je schopné odesílat síťové požadavky na pokyn útočníka.&lt;br /&gt;
# Zahájení útoku&lt;br /&gt;
#* Botnet začne současně posílat obrovské množství datagramů nebo požadavků na server.&lt;br /&gt;
#* Protože se jedná o legitimní požadavky (například zobrazení webové stránky ze serveru) z&amp;amp;nbsp;různých počítačů, není jednoduché útok filtrovat na základě běžných firewallů.&lt;br /&gt;
#* Server má omezené prostředky a nestíhá zpracovat všechny požadavky.&lt;br /&gt;
# Výsledek&lt;br /&gt;
#* Legitimní uživatelé se nedostanou ke službě.&lt;br /&gt;
#* Server může úplně spadnout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Phishing ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Získat citlivé informace o uživateli.&lt;br /&gt;
* Typickým cílem jsou přihlašovací údaje do elektronického bankovnictví nebo čísla kreditních karet.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
# Příprava falešného prostředí&lt;br /&gt;
#* Útočník vytvoří kopii webu (např. banky).&lt;br /&gt;
#* Vypadá téměř identicky jako originál.&lt;br /&gt;
# Distribuce&lt;br /&gt;
#* Pošle e-mail nebo SMS s odkazem.&lt;br /&gt;
#* Často používá psychologický nátlak:&lt;br /&gt;
#** „Účet bude zablokován“&lt;br /&gt;
#** „Potvrďte ihned platbu“&lt;br /&gt;
# Získání údajů&lt;br /&gt;
#* Oběť zadá:&lt;br /&gt;
#** login&lt;br /&gt;
#** heslo&lt;br /&gt;
#** číslo karty&lt;br /&gt;
# Zneužití&lt;br /&gt;
#* Útočník se přihlásí do skutečného účtu.&lt;br /&gt;
#* Může převést peníze nebo ukrást data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Man-in-the-Middle (MITM) ==&lt;br /&gt;
&lt;br /&gt;
; Cíl&lt;br /&gt;
* Odposlechnout údaje spojení, které měly zůstat důvěrné.&lt;br /&gt;
* Narušit šifrovanou komunikaci.&lt;br /&gt;
&lt;br /&gt;
; Průběh útoku&lt;br /&gt;
# Získání pozice mezi komunikujícími&lt;br /&gt;
#* Útočník vytvoří falešnou Wi-Fi síť nebo provede ARP spoofing.&lt;br /&gt;
# Přesměrování komunikace&lt;br /&gt;
#* Oběť si myslí, že komunikuje přímo se serverem.&lt;br /&gt;
#* Ve skutečnosti data prochází přes útočníka.&lt;br /&gt;
# Odposlech / manipulace&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** číst přenášená data&lt;br /&gt;
#** měnit obsah&lt;br /&gt;
#** vkládat škodlivý kód&lt;br /&gt;
# Nenápadnost&lt;br /&gt;
#* Komunikace často pokračuje bez přerušení.&lt;br /&gt;
#* Oběť si útoku nevšimne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spoofing (podvržení identity) ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Falšování identity&lt;br /&gt;
#* Útočník změní identifikační údaje:&lt;br /&gt;
#** IP adresu&lt;br /&gt;
#** e-mailovou hlavičku&lt;br /&gt;
#** DNS záznam&lt;br /&gt;
# Navázání důvěry&lt;br /&gt;
#* Systém nebo uživatel věří, že komunikace je legitimní.&lt;br /&gt;
# Zneužití&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** získat přístup&lt;br /&gt;
#** přesměrovat komunikaci&lt;br /&gt;
#** spustit další útok.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Brute-Force útok ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Získání cíle&lt;br /&gt;
#* Útočník zná přihlašovací stránku nebo účet.&lt;br /&gt;
# Automatizované pokusy&lt;br /&gt;
#* Program zkouší tisíce hesel za sekundu.&lt;br /&gt;
#* Používají se slovníky běžných hesel.&lt;br /&gt;
#* Pokud je heslo slabé, je nalezeno velmi rychle.&lt;br /&gt;
# Převzetí účtu&lt;br /&gt;
#* Útočník získá plnou kontrolu nad účtem a může ho dále zneužít.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Malware šířený sítí ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Distribuce&lt;br /&gt;
#* E-mailová příloha&lt;br /&gt;
#* stažení z webu&lt;br /&gt;
#* exploit zranitelnosti&lt;br /&gt;
# Spuštění&lt;br /&gt;
#* Uživatel otevře soubor nebo klikne na odkaz.&lt;br /&gt;
#* Malware se nainstaluje.&lt;br /&gt;
# Skrytá činnost&lt;br /&gt;
#* Běží na pozadí:&lt;br /&gt;
#** krade data&lt;br /&gt;
#** zaznamenává stisky kláves&lt;br /&gt;
#** šifruje soubory&lt;br /&gt;
# Další šíření&lt;br /&gt;
#* Může napadat další zařízení v síti.&lt;br /&gt;
&lt;br /&gt;
== SQL Injection ==&lt;br /&gt;
&lt;br /&gt;
; Průběh&lt;br /&gt;
# Nalezení zranitelného formuláře&lt;br /&gt;
* Například přihlašovací pole.&lt;br /&gt;
# Vložení škodlivého kódu&lt;br /&gt;
#* Útočník zadá SQL příkaz místo běžného textu.&lt;br /&gt;
# Spuštění databázového dotazu&lt;br /&gt;
#* Server příkaz vykoná, protože není správně ošetřen vstup.&lt;br /&gt;
# Získání dat&lt;br /&gt;
#* Útočník může:&lt;br /&gt;
#** zobrazit databázi&lt;br /&gt;
#** upravovat záznamy&lt;br /&gt;
#** mazat data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Společný průběh většiny útoků ==&lt;br /&gt;
&lt;br /&gt;
Typický útok má tyto fáze:&lt;br /&gt;
&lt;br /&gt;
# Průzkum (reconnaissance) – hledání zranitelností&lt;br /&gt;
# Proniknutí (exploitation) – využití slabiny&lt;br /&gt;
# Udržení přístupu – skrytá přítomnost v systému&lt;br /&gt;
# Zneužití – krádež dat nebo narušení služby&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat</id>
		<title>Flutter: Ukládání dat</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Flutter:_Ukl%C3%A1d%C3%A1n%C3%AD_dat"/>
				<updated>2026-02-16T11:36:00Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Nastavení projektu pro Firebase */ Doplněno ověření přihlášení do firebase.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
Pro trvalé uložení dat i po vypnutí aplikace můžeme data uložit:&lt;br /&gt;
* na lokální disk konkrétního zařízení&lt;br /&gt;
* do síťového úložiště (databáze, cloudové úložiště)&lt;br /&gt;
* můžeme rozdělit aplikaci na frontend a backend, kde data budou uložena v&amp;amp;nbsp;backendu (opět obvykle v&amp;amp;nbsp;databázi).&lt;br /&gt;
&lt;br /&gt;
Následuje několik příkladů možných řešení.&lt;br /&gt;
&lt;br /&gt;
== Lokální export: jsonEncode/jsonDecode ==&lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti ===&lt;br /&gt;
* Formát JSON lze zpracovávat i v dalších aplikacích – je vhodný pro výměnu dat mezi aplikacemi a je textový.&lt;br /&gt;
* Jednoduše lze uložit seznam objektů. Složitější vnořované struktury objektů je třeba ručně převádět.&lt;br /&gt;
* Není vhodné pro větší objem dat – převod na text může zvětšit objem dat.&lt;br /&gt;
* Vhodné zejména pro textová data: texty, celá čísla, logické hodnoty. Méně vhodné pro desetinná čísla, obrázky, ... z důvodu nutné konverze na text.&lt;br /&gt;
* Formát JSON neukládá datové typy.&lt;br /&gt;
* Výsledek je uložen lokálně – převod z mobilní aplikace na desktop apod. je třeba řešit ručně.&lt;br /&gt;
&lt;br /&gt;
=== Postup zápisu ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro zápis do souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;writeAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro parsování JSON využij metodu &amp;lt;code&amp;gt;jsonDecode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Postup čtení ===&lt;br /&gt;
# Nalezení umístění souboru:&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;path_provider&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;getApplicationDocumentsDirectory()&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro čtení souboru použij třídu &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; a metodu &amp;lt;code&amp;gt;readAsString&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Převod dat na JSON&lt;br /&gt;
#* Využij balíček &amp;lt;code&amp;gt;dart:convert&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Pro ukládání využij metodu &amp;lt;code&amp;gt;jsonEncode(list)&amp;lt;/code&amp;gt; – výsledkem bude textová reprezentace objektu ve formátu JSON.&lt;br /&gt;
&lt;br /&gt;
=== Ukázka použití v aplikaci ===&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 import 'package:path_provider/path_provider.dart';&lt;br /&gt;
 import 'dart:convert';&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MyApp());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyApp extends StatelessWidget {&lt;br /&gt;
   const MyApp({super.key});&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return MaterialApp(&lt;br /&gt;
       title: 'Úložiště Demo',&lt;br /&gt;
       home: HomePage('''storage: FileStorage()'''),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class Zaznam {&lt;br /&gt;
   final String jmeno;&lt;br /&gt;
   final int pocet;&lt;br /&gt;
 &lt;br /&gt;
   const Zaznam({ required this.jmeno, required this.pocet, }); &lt;br /&gt;
 &lt;br /&gt;
   // Převod do JSON&lt;br /&gt;
   '''Map&amp;lt;String, dynamic&amp;gt; toJson() =&amp;gt; {'''&lt;br /&gt;
     'jmeno': jmeno,&lt;br /&gt;
     'pocet': pocet,&lt;br /&gt;
   };&lt;br /&gt;
 &lt;br /&gt;
   // Obnov z JSON&lt;br /&gt;
   '''factory Zaznam.fromJson(Map&amp;lt;String, dynamic&amp;gt; json) {'''&lt;br /&gt;
     return Zaznam(&lt;br /&gt;
       jmeno: (json['jmeno']),&lt;br /&gt;
       pocet: json['pocet'] as int,&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Práce se soubory&lt;br /&gt;
 '''class FileStorage {'''&lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; get _localPath''' async {&lt;br /&gt;
     final directory = await getApplicationDocumentsDirectory();&lt;br /&gt;
     return directory.path;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;File&amp;gt; get _localFile''' async {&lt;br /&gt;
     final path = await _localPath;&lt;br /&gt;
     return File('$path/data.txt');&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;String&amp;gt; readFile()''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     return file.readAsString();&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; writeFile(String content)''' async {&lt;br /&gt;
     final file = await _localFile;&lt;br /&gt;
     await file.writeAsString(content);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 /// Stav aplikace včetně zápisu do souboru&lt;br /&gt;
 class HomePage extends StatefulWidget {&lt;br /&gt;
   final FileStorage storage;&lt;br /&gt;
   const HomePage('''{required this.storage}''');&lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;HomePage&amp;gt; createState() =&amp;gt; _HomePageState();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class _HomePageState extends State&amp;lt;HomePage&amp;gt; {&lt;br /&gt;
   List&amp;lt;Zaznam&amp;gt; _seznam = [];&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   void initState() {&lt;br /&gt;
     super.initState();&lt;br /&gt;
     '''_loadData();'''   // Načtení dat při startu&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _loadData() async {'''&lt;br /&gt;
     try {&lt;br /&gt;
       final jsonString = await widget.storage.readFile();&lt;br /&gt;
       final List&amp;lt;dynamic&amp;gt; decoded = jsonDecode(jsonString);&lt;br /&gt;
       setState(() {&lt;br /&gt;
         _seznam = decoded&lt;br /&gt;
             .map((item) =&amp;gt; Zaznam.fromJson(item as Map&amp;lt;String, dynamic&amp;gt;))&lt;br /&gt;
             .toList();&lt;br /&gt;
       });&lt;br /&gt;
     } catch (e) {&lt;br /&gt;
       TODO: Zobraz chybové hlášení vhodným způsobem.&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   '''Future&amp;lt;void&amp;gt; _saveData() async {'''&lt;br /&gt;
     final jsonString = jsonEncode(&lt;br /&gt;
       _seznam.map((z) =&amp;gt; z.toJson()).toList()&lt;br /&gt;
     );&lt;br /&gt;
     await widget.storage.writeFile(jsonString);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   void _addRecord() {&lt;br /&gt;
     setState(() {&lt;br /&gt;
       _seznam.add(Zaznam(&lt;br /&gt;
         jmeno: 'Josef',&lt;br /&gt;
         pocet: 1000,&lt;br /&gt;
       ));&lt;br /&gt;
     });&lt;br /&gt;
     '''_saveData();'''&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
       // ... vytvoř GUI&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Tip ===&lt;br /&gt;
* Pro větší objemy dat či komplexnější data lze pro export do formátu JSON využít balíček &amp;lt;code&amp;gt;json_serializable&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://hatchjs.com/list-to-json-flutter/ HatchJS.com &amp;gt; How to Convert a List to JSON in Flutter]&lt;br /&gt;
* [https://docs.flutter.dev/data-and-backend/serialization/json Flutter Docs &amp;gt; JSON and serialization]&lt;br /&gt;
* [https://docs.flutter.dev/cookbook/persistence/reading-writing-files Flutter Docs &amp;gt; Read and write files]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Lokální databáze: Hive ==&lt;br /&gt;
&lt;br /&gt;
* Data ukládá binárně, ale stále na lokální zařízení.&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* [https://medium.com/@ChanakaDev/hive-vs-shared-preferences-10353068a8a6 Medium.com: ChanakaDev &amp;gt; Hive vs. Shared Preferences]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Google Firestore ==&lt;br /&gt;
&lt;br /&gt;
* Cloud Firestore je cloudová NoSQL databáze od Google, která je součástí platformy Google Firebase. &lt;br /&gt;
&lt;br /&gt;
=== Vlastnosti Cloud Firestore ===&lt;br /&gt;
&lt;br /&gt;
; Výhody a nevýhody&lt;br /&gt;
* Firebase je dobře integrovaná do frameworku Flutter (Flutter také vyvíjí Google)&lt;br /&gt;
* Data se ukládají do cloudu – data může sdílet mobilní i webová aplikace&lt;br /&gt;
* Synchronizace dat v reálném čase&lt;br /&gt;
* Pro přístup k&amp;amp;nbsp;datům je potřeba připojení k&amp;amp;nbsp;internetu&lt;br /&gt;
* Pro malé projekty stačí varianta zdarma (pro větší bude třeba platit)&lt;br /&gt;
&lt;br /&gt;
; Struktura dat ve Firestore&lt;br /&gt;
* Data se neukládají do entit jako u ER databází – spíše jako několik seznamů objektů.&lt;br /&gt;
&lt;br /&gt;
Pojmy&lt;br /&gt;
* Dokument (Document) ... konkrétní záznam (jako jeden řádek v databázi) – například údaje o jednom uživateli.&lt;br /&gt;
* Pole (Field) ... konkrétní hodnota (atribut) – například jméno uživatele&lt;br /&gt;
* Kolekce (Collection) ... odpovídá entitě v ER databázích – je to vlastně seznam dokumentů&lt;br /&gt;
* Databáze (Database) ... skupina souvisejících kolekcí&lt;br /&gt;
* Projekt (Project) ... jeden projekt obvykle odpovídá jednomu softwarovému produktu. Může zahrnovat různé podoby jedné aplikace:&lt;br /&gt;
** IOS&lt;br /&gt;
** Android&lt;br /&gt;
** webová aplikace&lt;br /&gt;
** Unity&lt;br /&gt;
** Flutter multiplatformní aplikace&lt;br /&gt;
&lt;br /&gt;
Příklad:&lt;br /&gt;
 users (kolekce)&lt;br /&gt;
    └── user1 (dokument)&lt;br /&gt;
          ├── name: &amp;quot;Jan&amp;quot;&lt;br /&gt;
          ├── age: 18&lt;br /&gt;
          └── email: &amp;quot;jan@email.cz&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Nastavení projektu pro Firebase===&lt;br /&gt;
&lt;br /&gt;
; Založení projektu na webu Firebase&lt;br /&gt;
#Jdi na: [https://console.firebase.google.com Console.firebase.google.com]&lt;br /&gt;
#Klikni na Vytvořit projekt a zadej název projektu&lt;br /&gt;
#Po vytvoření přidej aplikaci (Android / iOS / Web)&lt;br /&gt;
&lt;br /&gt;
; Instalace FlutterFire CLI&lt;br /&gt;
# Nainstaluj Firebase CLI podle [https://firebase.google.com/docs/cli návodu z&amp;amp;nbsp; Firebase.google.com &amp;gt; CLI]&lt;br /&gt;
#* Bude nejspíš vyžadovate heslo správce počítače.&lt;br /&gt;
# Přihlaš se: &amp;lt;code&amp;gt;firebase login&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Musíš rozhodnout, jestli budeš využívat Google Gemini v rámci Firebase a jestli může Google využívat statistická data.&lt;br /&gt;
#* Zvolíš účet Google, pod kterým budeš pracovat&lt;br /&gt;
#* Ověř funkčnost pomocí: &amp;lt;code&amp;gt;firebase projects:list&amp;lt;/code&amp;gt; – mělo by vypsat seznam založených projektů&lt;br /&gt;
# Založ projekt ve Flutteru jako obvykle&lt;br /&gt;
# Ve složce projektu spusť aktivaci FlutterFire CLI:&lt;br /&gt;
#: &amp;lt;code&amp;gt;dart pub global activate flutterfire_cli&amp;lt;/code&amp;gt;&lt;br /&gt;
#: &amp;lt;code&amp;gt;flutterfire configure --project='''nazev-projektu'''&amp;lt;/code&amp;gt;&lt;br /&gt;
#: Do projektu tím přibude konfigurační soubor: &amp;lt;code&amp;gt;lib/firebase_options.dart&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Podle ChatGPT – ale neodpovídá návodu na Firebase:&lt;br /&gt;
Ve Flutter projektu spusť:&lt;br /&gt;
&lt;br /&gt;
 flutter pub add firebase_core&lt;br /&gt;
 flutter pub add cloud_firestore&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Inicializuj Firebase v main.dart:&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'firebase_options.dart';&lt;br /&gt;
 &lt;br /&gt;
 // ...&lt;br /&gt;
 &lt;br /&gt;
 await Firebase.initializeApp(&lt;br /&gt;
     options: DefaultFirebaseOptions.currentPlatform,&lt;br /&gt;
 );&lt;br /&gt;
&amp;lt;!-- Původní podle ChatGPT&lt;br /&gt;
 import 'package:firebase_core/firebase_core.dart';&lt;br /&gt;
 import 'package:flutter/material.dart';&lt;br /&gt;
 &lt;br /&gt;
 void main() async {&lt;br /&gt;
   WidgetsFlutterBinding.ensureInitialized();&lt;br /&gt;
   await Firebase.initializeApp();&lt;br /&gt;
   runApp(MyApp());&lt;br /&gt;
 }&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Další plug-iny importuj dle potřeby viz dále&lt;br /&gt;
&lt;br /&gt;
=== Import Firestore ===&lt;br /&gt;
&lt;br /&gt;
Import:&lt;br /&gt;
&lt;br /&gt;
 import 'package:cloud_firestore/cloud_firestore.dart';&lt;br /&gt;
&lt;br /&gt;
Vytvoření instance pro přístup k databázi:&lt;br /&gt;
&lt;br /&gt;
 final FirebaseFirestore db = FirebaseFirestore.instance;&lt;br /&gt;
&lt;br /&gt;
=== Přidání nového dokumentu ===&lt;br /&gt;
 await db.collection('users').add({&lt;br /&gt;
   'name': 'Jan',&lt;br /&gt;
   'age': 18,&lt;br /&gt;
   'email': 'jan@email.cz',&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
Tím se:&lt;br /&gt;
# vytvoří kolekce users (pokud neexistuje)&lt;br /&gt;
# přidá nový dokument s automatickým ID&lt;br /&gt;
&lt;br /&gt;
; Uložení dokumentu s vlastním ID&lt;br /&gt;
 await db.collection('users').doc('student1').set({&lt;br /&gt;
   'name': 'Petra',&lt;br /&gt;
   'age': 17,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Čtení dat z Firestore jednorázově===&lt;br /&gt;
&lt;br /&gt;
 var snapshot = await db.collection('users').get();&lt;br /&gt;
 &lt;br /&gt;
 for (var doc in snapshot.docs) {&lt;br /&gt;
   print(doc.data());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Čtení v reálném čase ===&lt;br /&gt;
&lt;br /&gt;
Firestore umožňuje poslouchat změny. Data se pak automaticky aktualizují, pokud proběhne změna v databázi (například z jiného zařízení připojeného ke stejnému projektu):&lt;br /&gt;
&lt;br /&gt;
 StreamBuilder(&lt;br /&gt;
   stream: db.collection('users').snapshots(),&lt;br /&gt;
   builder: (context, snapshot) {&lt;br /&gt;
     if (!snapshot.hasData) {&lt;br /&gt;
       return CircularProgressIndicator();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     var docs = snapshot.data!.docs;&lt;br /&gt;
 &lt;br /&gt;
     return ListView(&lt;br /&gt;
       children: docs.map((doc) {&lt;br /&gt;
         return ListTile(&lt;br /&gt;
           title: Text(doc['name']),&lt;br /&gt;
         );&lt;br /&gt;
       }).toList(),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
=== Aktualizace dat===&lt;br /&gt;
 await db.collection('users').doc('student1').update({&lt;br /&gt;
   'age': 18,&lt;br /&gt;
 });&lt;br /&gt;
&lt;br /&gt;
=== Smazání dat===&lt;br /&gt;
&lt;br /&gt;
; Smazání dokumentu&lt;br /&gt;
 await db.collection('users').doc('student1').delete();&lt;br /&gt;
&lt;br /&gt;
=== Bezpečnostní pravidla (Rules) ===&lt;br /&gt;
&lt;br /&gt;
Ve Firebase konzoli nastav pravidla přístupu.&lt;br /&gt;
&lt;br /&gt;
Například pouze pro přihlášené uživatele:&lt;br /&gt;
&lt;br /&gt;
 rules_version = '2';&lt;br /&gt;
 service cloud.firestore {&lt;br /&gt;
   match /databases/{database}/documents {&lt;br /&gt;
     match /{document=**} {&lt;br /&gt;
       allow read, write: if request.auth != null;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zdroje ===&lt;br /&gt;
* Základ sekce o Firebase byl vytvořen pomocí služby [https://www.chatgpt.com ChatGPT].&lt;br /&gt;
* [https://console.firebase.google.com/ Console.firebase.google.com &amp;gt; Postup nastavení projektu]&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ YouTube.com &amp;gt; Get to know Cloud Firebase] (seriál videí)&lt;br /&gt;
* [https://cloud.google.com/firestore/pricing Google Cloud &amp;gt; Firestore Pricing]&lt;br /&gt;
&lt;br /&gt;
== Vlastní backend: ServerPod ==&lt;br /&gt;
&lt;br /&gt;
* Framework, který umožňuje vytvořit projekt Flutteru se dvěma částmi: backendem a frontendem.&lt;br /&gt;
* Backend je následně možné spustit na svém serveru.&lt;br /&gt;
* Frontend běží na desktopu.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Moodle_GIFT</id>
		<title>Moodle GIFT</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Moodle_GIFT"/>
				<updated>2026-02-16T05:35:18Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Vytvoření kostry stránky a multichoice otázka.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Jiné]]&lt;br /&gt;
&lt;br /&gt;
GIFT je otevřený formát Moodle pro popis testových otázek.&lt;br /&gt;
&lt;br /&gt;
== Multichoice ==&lt;br /&gt;
&lt;br /&gt;
 //TODO!!!&lt;br /&gt;
 ::oblast_nazev0XY::&lt;br /&gt;
 Vyberte správná tvrzení o ...: &lt;br /&gt;
 [Vyber všechny správné odpovědi. Za nesprávné odpovědi dostáváš záporné body]&lt;br /&gt;
 {&lt;br /&gt;
 ~%20%Správná A&lt;br /&gt;
 ~%40%Správná B&lt;br /&gt;
 ~%40%Správná C.#Komentář k odpovědi k zobrazení ve výsledcích&lt;br /&gt;
 ~%-20%Špatně X&lt;br /&gt;
 ~%-20%Špatně Y&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* [https://docs.moodle.org/501/en/GIFT_format Moodle.org &amp;gt; GIFT format]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Flutter:_ListView</id>
		<title>Flutter: ListView</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Flutter:_ListView"/>
				<updated>2026-01-26T09:37:17Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Formátování, upřesnění title a subtitle&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* &amp;lt;code&amp;gt;ListView&amp;lt;/code&amp;gt; slouží pro zobrazení dynamického seznamu položek, kterým lze skrolovat.&lt;br /&gt;
* Lze ho využít například pro zobrazení položek ze seznamu či pro položky, které přidáváme postupně.&lt;br /&gt;
&lt;br /&gt;
== Příklad zobrazení seznamu ==&lt;br /&gt;
* Pro zobrazení seznamu &amp;lt;code&amp;gt;seznam&amp;lt;/code&amp;gt; můžeme použít ListView:&lt;br /&gt;
  List&amp;lt;Element&amp;gt; seznam = ...;&lt;br /&gt;
&lt;br /&gt;
  Expanded(&lt;br /&gt;
    child: ListView.builder(&lt;br /&gt;
      itemCount: _seznam.length,&lt;br /&gt;
      itemBuilder: (context, index) {&lt;br /&gt;
        return ListTile(&lt;br /&gt;
            title: Text('${_seznam[index].nazev}'),&lt;br /&gt;
            subtitle: Text('${_seznam[index].popis}'),&lt;br /&gt;
        );&lt;br /&gt;
      },&lt;br /&gt;
    ),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vytvoření ListView ==&lt;br /&gt;
&lt;br /&gt;
=== ListView.builder() ===&lt;br /&gt;
* Používá se pro delší nebo dynamické seznamy (nejčastější varianta).&lt;br /&gt;
* Vytváří položky až když jsou potřeba (lepší výkon)&lt;br /&gt;
&lt;br /&gt;
 ListView.builder(&lt;br /&gt;
   itemCount: 10,&lt;br /&gt;
   itemBuilder: (context, index) {&lt;br /&gt;
     return ListTile(&lt;br /&gt;
       title: Text('Položka $index'),&lt;br /&gt;
     );&lt;br /&gt;
   },&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
=== ListView(children: []) ===&lt;br /&gt;
* Vhodné pro krátké statické seznamy &amp;amp;mdash; nelze přidávat položky.&lt;br /&gt;
&lt;br /&gt;
 ListView(&lt;br /&gt;
   children: [&lt;br /&gt;
     ListTile(title: Text('Položka 1')),&lt;br /&gt;
     ListTile(title: Text('Položka 2')),&lt;br /&gt;
     ListTile(title: Text('Položka 3')),&lt;br /&gt;
   ],&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ListTile: položka seznamu ==&lt;br /&gt;
&lt;br /&gt;
* Jednu položku dynamického seznamu reprezentuje widget &amp;lt;code&amp;gt;ListTile&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Vlastnosti &amp;lt;code&amp;gt;ListTile&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; – hlavní text (nadpis položky)&lt;br /&gt;
* &amp;lt;code&amp;gt;subtitle&amp;lt;/code&amp;gt; – doplňující popis položky&lt;br /&gt;
* &amp;lt;code&amp;gt;leading&amp;lt;/code&amp;gt; – ikona vlevo&lt;br /&gt;
* &amp;lt;code&amp;gt;trailing&amp;lt;/code&amp;gt; – ikona vpravo&lt;br /&gt;
* &amp;lt;code&amp;gt;onTap&amp;lt;/code&amp;gt; – reakce na kliknutí&lt;br /&gt;
&lt;br /&gt;
; Příklad použití:&lt;br /&gt;
&lt;br /&gt;
 ListTile(&lt;br /&gt;
   leading: Icon(Icons.person),&lt;br /&gt;
   title: Text('Karel Dvořák'),&lt;br /&gt;
   subtitle: Text('místnost: 33'),&lt;br /&gt;
   trailing: Icon(Icons.arrow_forward),&lt;br /&gt;
   onTap: () {&lt;br /&gt;
     _reakceNaKlik;&lt;br /&gt;
   },&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Flutter: Základní widgety]]&lt;br /&gt;
* [[Flutter: Kostra aplikace]]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Z%C3%A1kladn%C3%AD_pojmy_Linuxu</id>
		<title>Základní pojmy Linuxu</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Z%C3%A1kladn%C3%AD_pojmy_Linuxu"/>
				<updated>2025-09-10T05:12:24Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Úvod do Linuxu */ Oprava formátu.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Linux]]&lt;br /&gt;
&lt;br /&gt;
== Úvod do Linuxu ==&lt;br /&gt;
&lt;br /&gt;
* Z&amp;amp;nbsp;pohledu běžného uživatele je Linux obdobný operační systém jako každý jiný. &lt;br /&gt;
* Při přechodu z&amp;amp;nbsp;Windows je ale dobré seznámit se s&amp;amp;nbsp;pojmy, které ve světě Windows nejsou.&lt;br /&gt;
&lt;br /&gt;
== Distribuce ==&lt;br /&gt;
&lt;br /&gt;
* Linux je ve skutečnosti jádro operačního systému (''kernel''). &lt;br /&gt;
* Běžní uživatelé říkají, že si &amp;quot;nainstalovali Linux&amp;quot;. &lt;br /&gt;
* Ve skutečnosti si instalují některý operační systém, založený na Linuxu, protože aby mohli jádro využívat, musí být doplněno o další nástroje a programy.&lt;br /&gt;
* Operační systémy, založené na Linuxu, se označují ''distribuce Linuxu''.&lt;br /&gt;
* Jednoduše: distribuce = jádro Linux + software + nástroje pro instalaci a správu.&lt;br /&gt;
* Příklady známých distribucí jsou Red Hat, Debian, Fedora, Ubuntu, Slackware a další.&lt;br /&gt;
* Více o distribucích viz [[Distribuce GNU/Linuxu]].&lt;br /&gt;
&lt;br /&gt;
== Stažení a instalace ==&lt;br /&gt;
&lt;br /&gt;
* Při hledání instalačních zdrojů možná narazíš na pojmy, které nebudeš z&amp;amp;nbsp;Windows znát.&lt;br /&gt;
* Konkrétní označení a nabídka se ale může lišit podle konkrétní distribuce. Některé distribuce nabízí variant více, jiné méně. Můžou také stejné věci označit jinak.&lt;br /&gt;
&lt;br /&gt;
=== Live DVD vs. netinst ===&lt;br /&gt;
&lt;br /&gt;
* ''Live DVD'' je instalační obraz, ze kterého jde operační systém spustit bez nutnosti instalace. Bývá větší (minimálně cca 700 MB) a obsahuje zákadní software pro běžnou práci na počítači: kancelářský software, grafický editor, uživatelské rozhraní a další.&lt;br /&gt;
* ''netinst'' je minimální verze instalátoru, která pouze nastartuje instalaci a samotné balíčky již stahuje z&amp;amp;nbsp;internetu. Pro běžné instalace je nejvhodnější – stáhnete si pouze to, co potřebujete. Velikost obrazu je obvykle cca 350 MB.&lt;br /&gt;
&lt;br /&gt;
=== Stable vs. testing ===&lt;br /&gt;
&lt;br /&gt;
* Při vývoji distribucí tvůrci obvykle nabízí možnost získat nejaktuálnější variantu, která ale ještě nemusí být dobře otestována. Obvykle se označuje jako ''testing''.&lt;br /&gt;
* Pro produkční servery a pro výuku začátečníků doporučujeme spíš variantu ''stable''.&lt;br /&gt;
&lt;br /&gt;
=== Cílová architektura procesoru: amd64, x86, ... ===&lt;br /&gt;
&lt;br /&gt;
* Při volbě instalátoru si musíš vybrat cílovou architekturu procesoru. Linux totiž neběží jen na procesorech pro architekturu IBM PC, ale i ARM a dalších.&lt;br /&gt;
* Pokud instaluješ Linux na běžné PC, hledej označení: ''amd64'', ''x86-64'', ''x86'' (obvykle 32bitová verze). &lt;br /&gt;
* Je jedno, jestli máš procesor AMD či Intel – oba výrobci používají stejnou architekturu. Označení ''amd64'' vzniklo historicky a funguje i pro procesory Intel.&lt;br /&gt;
* Další běžně používané architektury bývají: ''arm64''. Nabídka se může lišit pro různé distribuce.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grafická prostředí pro Linuxu ==&lt;br /&gt;
&lt;br /&gt;
* Linux se nejčastěji ovládá z&amp;amp;nbsp;příkazového řádku, protože je to praktické pro servery.&lt;br /&gt;
* Pro stolní počítače ale můžeš využít grafická prostředí.&lt;br /&gt;
* Mezi nejběžnější grafická prostředí patří: ''GNOME'', ''KDE'', ''Xfce''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Odlišnosti Linuxu ==&lt;br /&gt;
&lt;br /&gt;
=== Modularita ===&lt;br /&gt;
&lt;br /&gt;
=== Svobodný software ===&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Dart:_U%C5%BEite%C4%8Dn%C3%A9_tipy</id>
		<title>Dart: Užitečné tipy</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Dart:_U%C5%BEite%C4%8Dn%C3%A9_tipy"/>
				<updated>2025-03-11T02:33:54Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Doplněno trim() a  toString(), lepší formátování.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Vstup a výstup ==&lt;br /&gt;
&lt;br /&gt;
=== Konec řádku ===&lt;br /&gt;
 Platform.lineTerminator&lt;br /&gt;
* Ukončení řádku odpovídající použité platformě (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Je třeba naimportovat:&lt;br /&gt;
 import 'dart:io';&lt;br /&gt;
&lt;br /&gt;
=== Konverze čísel a textů ===&lt;br /&gt;
&lt;br /&gt;
 int.parse(''text'')&lt;br /&gt;
 double.parse(''text'')&lt;br /&gt;
* Převod textového zápisu na číselnou hodnotu.&lt;br /&gt;
&lt;br /&gt;
 ''text''.trim()&lt;br /&gt;
* Odstraní úvodní a závěrečné mezery z&amp;amp;nbsp;textu.&lt;br /&gt;
&lt;br /&gt;
 ''num''.toString()&lt;br /&gt;
* Převede číselnou hodnotu na textový zápis.&lt;br /&gt;
&lt;br /&gt;
 ''num''.toStringAsFixed(2)&lt;br /&gt;
* Převede číslo &amp;lt;code&amp;gt;num&amp;lt;/code&amp;gt; na text, zaokrouhlený na zadaný počet desetinných míst.&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety</id>
		<title>Flutter: Základní widgety</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Flutter:_Z%C3%A1kladn%C3%AD_widgety"/>
				<updated>2025-02-21T06:18:40Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: /* Jednoduchý dialog */ Lépe struktorováno, přidány příklady dialogů, připraveno na budoucí osamostatnění.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Uspořádání stránky ==&lt;br /&gt;
&lt;br /&gt;
 Center( child: ... )&lt;br /&gt;
* Vycentruje obsah uvnitř widgetu.&lt;br /&gt;
&lt;br /&gt;
 Column(&lt;br /&gt;
   mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
   children: &amp;lt;Widget&amp;gt;[ ... ]&lt;br /&gt;
 )&lt;br /&gt;
* Vloží blok více prvků poskládaných pod sebe.&lt;br /&gt;
&lt;br /&gt;
 Padding(&lt;br /&gt;
   padding: EdgeInsetsGeometry.all(20),&lt;br /&gt;
   child: ...&lt;br /&gt;
 )&lt;br /&gt;
* Všechny prvky budou odsazeny navzájem o 20 pixelů.&lt;br /&gt;
&lt;br /&gt;
 Expanded( child: ... )&lt;br /&gt;
* Tato část okna se bude roztahovat při zvětšování okna.&lt;br /&gt;
&lt;br /&gt;
== Textová pole ==&lt;br /&gt;
 TextField(&lt;br /&gt;
   controller: _abcController,&lt;br /&gt;
   decoration: const InputDecoration(&lt;br /&gt;
     labelText: 'Nadpis pole – viditelný popisek:',&lt;br /&gt;
   ),&lt;br /&gt;
   keyboardType: TextInputType.number, // Pokud chceme omezit vstup na číselné hodnoty&lt;br /&gt;
 ),&lt;br /&gt;
&lt;br /&gt;
; Parametry widgetu&lt;br /&gt;
&lt;br /&gt;
 enabled:  &lt;br /&gt;
* Aktivní/zakázané textové pole.&lt;br /&gt;
* Zakázané textové pole je šedivé a nejde do něj umístit kurzor.&lt;br /&gt;
&lt;br /&gt;
 readOnly:  &lt;br /&gt;
* Textové pole pouze pro čtení – ale není šedivé a lze do něj umístit kurzor&lt;br /&gt;
&lt;br /&gt;
 onChanged: (text) { ... }&lt;br /&gt;
* Metoda, která se zavolá při změně obsahu tlačítka. &lt;br /&gt;
* Metoda musí přijímat jako parametr text.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Kontroler textového pole&lt;br /&gt;
 final TextEditingController _abcController = TextEditingController();&lt;br /&gt;
* Pro práci s obsahem textového pole slouží &amp;lt;code&amp;gt;TextEditingController&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 final double totalPrice = double.parse(parsedValue = _abcController.text.trim());&lt;br /&gt;
* Přístup k obsahu textového pole zprostředkovává atribut &amp;lt;code&amp;gt;.text&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Obdobně lze &amp;lt;code&amp;gt;int.parse(...)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 _abcController.dispose()&lt;br /&gt;
* Při uvolňování paměti by měly být řádně uvolněny i kontrolery metodou &amp;lt;code&amp;gt;dispose()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; Nastavení vzhledu &amp;lt;code&amp;gt;InputDecoration&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 contentPadding: EdgeInsets.all(20.0),&lt;br /&gt;
* Odsazení obsahu&lt;br /&gt;
&lt;br /&gt;
 border: OutlineInputBorder(),&lt;br /&gt;
* Ohraničení textového pole&lt;br /&gt;
&lt;br /&gt;
 labelText: 'text'&lt;br /&gt;
* Popiska textového pole.&lt;br /&gt;
* Když je pole prázdné, text je v poli.&lt;br /&gt;
* Jakmile uživatel pole vyplní, popiska se přesune do rámečku textového pole.&lt;br /&gt;
&lt;br /&gt;
 hintText: 'Text'&lt;br /&gt;
* Nápověda – co má uživatel zadat do pole.&lt;br /&gt;
* Po zadání textu do pole text zmizí.&lt;br /&gt;
&lt;br /&gt;
== Tlačítka ==&lt;br /&gt;
  ElevatedButton(&lt;br /&gt;
    onPressed: _nazevMetodyReakce,&lt;br /&gt;
    child: const Text('Popis tlačítka'),&lt;br /&gt;
  ),&lt;br /&gt;
&lt;br /&gt;
; Vlastnosti:&lt;br /&gt;
&lt;br /&gt;
 onPressed:   &lt;br /&gt;
* Název metody, která se vyvolá při stisknutí tlačítka.&lt;br /&gt;
* Obecně může být vložena akce i přímo&lt;br /&gt;
&lt;br /&gt;
 child:  &lt;br /&gt;
* Obsah tlačítka – popis, ikona, obrázek, ...&lt;br /&gt;
&lt;br /&gt;
== ListView ==&lt;br /&gt;
* Pro zobrazení dynamického seznamu prvků.&lt;br /&gt;
* Více viz samostatná stránka [[Flutter: ListView]].&lt;br /&gt;
&lt;br /&gt;
== Odsazení ==&lt;br /&gt;
 SizedBox(height: 10),&lt;br /&gt;
&lt;br /&gt;
Příklad použití:&lt;br /&gt;
 Column(&lt;br /&gt;
   const Text('Hello'),&lt;br /&gt;
   const Sizedbox(height: 10),&lt;br /&gt;
   const Text('World!'),&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
== Textová popiska ==&lt;br /&gt;
 const Text('Záznamy o tankování:',),&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Vyskakovací bublina (Toast) ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;mobilních aplikacích se pro stručná oznámení používá spíše vyskakovací bublina, než vyskakovací okno.&lt;br /&gt;
&lt;br /&gt;
  setState(() {&lt;br /&gt;
    ScaffoldMessenger.of(context).showSnackBar(&lt;br /&gt;
      SnackBar(&lt;br /&gt;
          content: Text('Informace pro uživatele')&lt;br /&gt;
      ),&lt;br /&gt;
    );&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Jednoduchý dialog ==&lt;br /&gt;
&lt;br /&gt;
Pro vytvoření jednoduchého dialogu slouží třída &amp;lt;code&amp;gt;AlertDialog&amp;lt;/code&amp;gt;.&lt;br /&gt;
; Parametry konstruktoru &amp;lt;code&amp;gt;AlertDialog&amp;lt;/code&amp;gt;&lt;br /&gt;
 title: const Text('Titulek dialogu')&lt;br /&gt;
 content: const Text('Zpráva dialogu...')&lt;br /&gt;
 actions: [ ''seznam akcí/tlačítek'' ]&lt;br /&gt;
&lt;br /&gt;
; Příklad – Jednoduchý dialog s jedním tlačítkem&lt;br /&gt;
 AlertDialog(&lt;br /&gt;
   title: const Text('Skutečně smazat položku'),&lt;br /&gt;
   content: const Text('Soubor neobsahuje platná data!'),&lt;br /&gt;
   actions: [&lt;br /&gt;
     TextButton(&lt;br /&gt;
       onPressed: () =&amp;gt; Navigator.pop(context),&lt;br /&gt;
       child: const Text('OK'),&lt;br /&gt;
     ),&lt;br /&gt;
   ]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
; Příklad – Potvrzovací dialog se dvěma tlačítky&lt;br /&gt;
 AlertDialog(&lt;br /&gt;
   title: const Text('Upozornění'),&lt;br /&gt;
   content: const Text('Skutečně chcete smazat položku XYZ?'),&lt;br /&gt;
   actions: [&lt;br /&gt;
     '''TextButton('''&lt;br /&gt;
       onPressed: () =&amp;gt; {&lt;br /&gt;
         setState(() { ''_akceSmazSkutecne();'' };);&lt;br /&gt;
         _akceUloz();&lt;br /&gt;
         Navigator.pop(context);&lt;br /&gt;
       },&lt;br /&gt;
       child: const '''Text('Smaž'),'''&lt;br /&gt;
     '''),'''&lt;br /&gt;
     '''TextButton('''&lt;br /&gt;
       onPressed: () =&amp;gt; Navigator.pop(context),&lt;br /&gt;
       child: const '''Text('Zrušit'),'''&lt;br /&gt;
     '''),'''&lt;br /&gt;
   ]&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
=== Vyvolání dialogu ===&lt;br /&gt;
&lt;br /&gt;
; Metoda pro různá hlášení&lt;br /&gt;
&lt;br /&gt;
Můžeme připravit metodu pro vyvolání obecného dialogu:&lt;br /&gt;
  Future&amp;lt;void&amp;gt; ukazHlaseni(String messageText) =&amp;gt; showDialog&amp;lt;void&amp;gt;(&lt;br /&gt;
    context: context,&lt;br /&gt;
    builder: (context) {&lt;br /&gt;
      return AlertDialog( ''...'' );&lt;br /&gt;
    },&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
Metodu následně voláme:&lt;br /&gt;
 ukazHlaseni('Text');&lt;br /&gt;
&lt;br /&gt;
; Volání přímo v kódu&lt;br /&gt;
&lt;br /&gt;
Můžeme také dialog vytvořit a rovnou ho zavolat:&lt;br /&gt;
 showDialog(&lt;br /&gt;
   context: context,&lt;br /&gt;
   builder: (context) =&amp;gt; AlertDialog( ''...'' ),&lt;br /&gt;
 )&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Flutter:_Kostra_aplikace</id>
		<title>Flutter: Kostra aplikace</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Flutter:_Kostra_aplikace"/>
				<updated>2025-02-21T06:08:36Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Do uspořádání body přidáno `Padding` místo `Center` jako výchozí.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Základní kostra aplikace s měnícím se obsahem ==&lt;br /&gt;
&lt;br /&gt;
Metoda &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; &amp;amp;mdash; zde se začne provádět program:&lt;br /&gt;
&lt;br /&gt;
 void main() {&lt;br /&gt;
   runApp(const MainApp());&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; StatelessWidget – neměnná část aplikace.&lt;br /&gt;
&lt;br /&gt;
* Základ aplikace je neměnný. Pokud bychom měli aplikaci ``Hello World`` a podobné, stačilo by nám jejich vzhled nadefinovat v hlavní třídě.&lt;br /&gt;
* Části, které se musí překreslit nebo které mění obsah, jsou součásti stavu aplikace.&lt;br /&gt;
&lt;br /&gt;
 class MainApp extends StatelessWidget {&lt;br /&gt;
   const MainApp({super.key}); &lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return const MaterialApp(&lt;br /&gt;
       home: XyzMainPage(title: 'Název aplikace'),&lt;br /&gt;
     );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; StatefulWidget – část UI, která se musí překreslit v&amp;amp;nbsp;průběhu životního cyklu aplikace.&lt;br /&gt;
&lt;br /&gt;
 class XyzMainPage extends StatefulWidget {&lt;br /&gt;
   const XyzMainPage({super.key, required this.title});&lt;br /&gt;
 &lt;br /&gt;
   final String title;&lt;br /&gt;
 &lt;br /&gt;
   @override&lt;br /&gt;
   State&amp;lt;XyzMainPage&amp;gt; createState() =&amp;gt; _XyzMainPageState();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
; Reprezentace aktuálního stavu aplikace – State&lt;br /&gt;
&lt;br /&gt;
 class _XyzMainPageState extends State&amp;lt;XyzMainPage&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
   // Data aplikace&lt;br /&gt;
  &lt;br /&gt;
   // Metody pro práci s daty&lt;br /&gt;
   // Controllery tlačítek&lt;br /&gt;
 &lt;br /&gt;
   void _akceProvadejiciZmenuStavuOkna() { // Například reakce na stisk tlačítka.&lt;br /&gt;
      setState(() { ... });&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   @override&lt;br /&gt;
   void dispose() {      // Uvolnění případných kontrollerů, pokud jsou.&lt;br /&gt;
     _abcController.dispose();&lt;br /&gt;
     super.dispose();&lt;br /&gt;
   }&lt;br /&gt;
   &lt;br /&gt;
   @override&lt;br /&gt;
   Widget build(BuildContext context) {&lt;br /&gt;
     return Scaffold(&lt;br /&gt;
         appBar: AppBar(&lt;br /&gt;
           backgroundColor: Colors.green,&lt;br /&gt;
           title: Text(widget.title),&lt;br /&gt;
         ),&lt;br /&gt;
         body: Padding(&lt;br /&gt;
           padding: const EdgeInsets.all(20.0),&lt;br /&gt;
           child: Column(&lt;br /&gt;
             mainAxisAlignment: MainAxisAlignment.center,&lt;br /&gt;
             children: &amp;lt;Widget&amp;gt;[&lt;br /&gt;
 &lt;br /&gt;
               // Widgety v hlavním okně&lt;br /&gt;
 &lt;br /&gt;
             ],&lt;br /&gt;
           ),&lt;br /&gt;
         ),&lt;br /&gt;
         floatingActionButton: FloatingActionButton(&lt;br /&gt;
           onPressed: _metodaProvedeniAkce,&lt;br /&gt;
           tooltip: 'Nápověda k tlačítku',&lt;br /&gt;
           child: const Icon(Icons.add),&lt;br /&gt;
         ),&lt;br /&gt;
       );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* Základní widgety pro vytvoření obsahu okna: [[Flutter: Základní widgety]].&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Profesn%C3%AD_prezentace</id>
		<title>Profesní prezentace</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Profesn%C3%AD_prezentace"/>
				<updated>2025-01-12T06:44:51Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Přidána obecná doporučení.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Jiné]]&lt;br /&gt;
&lt;br /&gt;
Nástroje pro profesní prezentaci umožňují IT profesionálovi prezentovat své možnosti potenciálním zákazníkům a zaměstnavatelům.&lt;br /&gt;
&lt;br /&gt;
== LinkedIn ==&lt;br /&gt;
&lt;br /&gt;
* Sociální síť, určená pro profesní prezentaci.&lt;br /&gt;
* Umožňuje vystavit elektronickou verzi životopisu a průběžně ji aktualizovat.&lt;br /&gt;
* Můžete také zadat, zda hledáte práci a filtrovat, o jakou práci máte zájem (plný nebo částečný úvazek, možnost práce z&amp;amp;nbsp;domu,..).&lt;br /&gt;
* Potenciálním zaměstnancům i zaměstnavatelům umožňuje filtrovat nabídky.&lt;br /&gt;
* V&amp;amp;nbsp;oblasti IT se jedná o běžný způsob oslovení potenciálních zaměstnavatelů a zaměstnanců.&lt;br /&gt;
&lt;br /&gt;
== Doporučení pro tvorbu životopisu ==&lt;br /&gt;
&lt;br /&gt;
* Životopis (anglicky ''resume'') je prvním kontaktem mezi vámi a zaměstnavatelem.&lt;br /&gt;
* Nikdy v životopisu nelžete! Údaje jsou snadno ověřitelné.&lt;br /&gt;
* Uvádějte přesné údaje (dokončení studia, začátek a konec předchozích pracovních poměrů,...).&lt;br /&gt;
* Kontrolujte pečlivě gramatiku a překlepy!&lt;br /&gt;
&lt;br /&gt;
== Obecná doporučení ==&lt;br /&gt;
* Sledujte svou digitální stopu a pracujte s&amp;amp;nbsp;ní.&lt;br /&gt;
* Zdůrazněte, že umíte a jste připraveni růst.&lt;br /&gt;
* Nepředstírejte něco, co nejste.&lt;br /&gt;
* Znejte své přednosti a zdůrazněte je.&lt;br /&gt;
&lt;br /&gt;
== Zdroje ==&lt;br /&gt;
* [https://www.cnbc.com/2024/11/26/biggest-resume-red-flags-from-recruiter-whos-interviewed-thousands.html Biggest resume red flags. CNBC.com]&lt;br /&gt;
* [https://www.linkedin.com/business/sales/blog/profile-best-practices/17-steps-to-a-better-linkedin-profile-in-2017 17 steps to a better LinkedIn profile in 2017. LinkedIn]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	<entry>
		<id>http://mis.martin-simunek.cz/index.php/Dart_vs._Java</id>
		<title>Dart vs. Java</title>
		<link rel="alternate" type="text/html" href="http://mis.martin-simunek.cz/index.php/Dart_vs._Java"/>
				<updated>2024-09-22T05:34:25Z</updated>
		
		<summary type="html">&lt;p&gt;Spravce: Přidána syntaxe try-on-catch.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:Flutter]]&lt;br /&gt;
&lt;br /&gt;
== Dart vs. Java ==&lt;br /&gt;
&lt;br /&gt;
* Na této stránce shrnujeme základní rozdíly mezi programovacími jazyky Dart a Java.&lt;br /&gt;
* Stránka je určena pro čtenáře, kteří již znají Javu a chtějí se rychle zorientovat v&amp;amp;nbsp;jazyce Dart.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;Poznamka&amp;quot;&amp;gt;&lt;br /&gt;
Syntaxi si můžete vyzkoušet například na: &lt;br /&gt;
* [https://dartpad.dev/ Dartpad.dev]&lt;br /&gt;
* [https://www.tutorialspoint.com/execute_dart_online.php TutorialsPoint.com &amp;amp;rarr; Execute Dart Online]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hello world ==&lt;br /&gt;
&lt;br /&gt;
* Pro metodu &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; nemusíme vytvářet zapouzdřující třídu.&lt;br /&gt;
* Parametry metody &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; jsou volitelné, pokud je nevyužíváme, nemusíme je uvádět.&lt;br /&gt;
* Výpis na obrazovku se řeší příkazem &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 main(){&lt;br /&gt;
    print(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Datové typy ==&lt;br /&gt;
&lt;br /&gt;
* Dart nepoužívá primitivní datové typy, všechny typy jsou objektové.&lt;br /&gt;
* Dart má vestavěné datové typy, pro které lze vytvářet literály (konkrétní hodnoty) přímo v&amp;amp;nbsp;kódu:&lt;br /&gt;
** Číselné typy: &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;&lt;br /&gt;
** Textové typy: &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;&lt;br /&gt;
** Logické hodnoty: &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; (literály: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Záznamy: &amp;lt;code&amp;gt;(hodnota1, hodnota2)&amp;lt;/code&amp;gt;&lt;br /&gt;
** Kolekce: &amp;lt;code&amp;gt;List&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Set&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Map&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Runes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Symbol&amp;lt;/code&amp;gt;&lt;br /&gt;
** Prázdnou hodnotu: &amp;lt;code&amp;gt;Null&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Více viz: [https://dart.dev/language/built-in-types Dart.dev &amp;gt; Built-in Types].&lt;br /&gt;
&lt;br /&gt;
== String ==&lt;br /&gt;
&lt;br /&gt;
* Textové literály uvozujeme uvozovkami nebo apostrofy (běžněji se využívá apostrof – bohužel pro ty, kdo píší na české klávesnici).&lt;br /&gt;
* Víceřádkové texty lze uvozovat třemi apostrofy.&lt;br /&gt;
 'Text'&lt;br /&gt;
 &amp;quot;Text&amp;quot;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;Víceřádkový&lt;br /&gt;
 text&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
* Spojení (concatenate) textů můžete provádět pomocí operátoru &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; nebo tím, že je zapíšete za sebe:&lt;br /&gt;
 String text = 'Dart' 'is' 'fun';&lt;br /&gt;
 String text = 'Dart'+'is'+'fun';&lt;br /&gt;
* Pro vložení hodnot do textu můžete využít znak &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;, který uvozuje vloženou hodnotu. Hodnotu lze ohraničit &amp;lt;code&amp;gt;${...}&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 print('Seznam $data má největší prvek ${getMax(data)}');&lt;br /&gt;
&lt;br /&gt;
Více o textech v&amp;amp;nbsp;Dartu: [https://api.dart.dev/stable/3.5.3/dart-core/String-class.html Dart.dev &amp;amp;rarr; String class].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Práce se seznamy ==&lt;br /&gt;
&lt;br /&gt;
* Do seznamu v&amp;amp;nbsp;Dartu lze vkládat i prvky primitivních datových typů.&lt;br /&gt;
* Lze vytvořit literál seznamu přímo v&amp;amp;nbsp;kódu pomocí znaků &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 List&amp;lt;int&amp;gt; ids = [1, 2, 3];&lt;br /&gt;
 ids.add(6);&lt;br /&gt;
&lt;br /&gt;
* Získání prvku ze seznamu:&lt;br /&gt;
&lt;br /&gt;
 print(ids[0]);&lt;br /&gt;
&lt;br /&gt;
* Metoda &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt; umí vypsat obsah seznamu.&lt;br /&gt;
&lt;br /&gt;
 print(ids);&lt;br /&gt;
&lt;br /&gt;
* Počet prvků seznamu:&lt;br /&gt;
&lt;br /&gt;
 print(ids.length)&lt;br /&gt;
&lt;br /&gt;
* Spojení prvků ze seznamu do jednoho textového řetězce:&lt;br /&gt;
&lt;br /&gt;
 list.join(delimiter);&lt;br /&gt;
 ids.join(',');&lt;br /&gt;
&lt;br /&gt;
* Více o práci se seznamy v&amp;amp;nbsp;Dartu viz například: [https://www.codevscolor.com/dart-insert-items-to-list CodeVsColor &amp;amp;rarr; Dart insert items to list].&lt;br /&gt;
&lt;br /&gt;
== Zápis tříd ==&lt;br /&gt;
&lt;br /&gt;
* V&amp;amp;nbsp;Dartu můžeme umístit více tříd do jednoho souboru.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Přístupnost vlastností tříd ===&lt;br /&gt;
&lt;br /&gt;
* Dart nepoužívá modifikátory přístupu &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;protected&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Všechny vlastnosti (atributy a metody) tříd jsou přístupné v&amp;amp;nbsp;rámci jednoho souboru, případně v&amp;amp;nbsp;rámci jedné knihovny (library).&lt;br /&gt;
* Veřejné vlastnosti jsou přístupné i z&amp;amp;nbsp;ostatních knihoven (souborů).&lt;br /&gt;
* Privátní vlastnosti se odlišují tak, že jejich název začíná podtržítkem.&lt;br /&gt;
* Přístupové metody se označují klíčovými slovy &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 class A {&lt;br /&gt;
     String first;&lt;br /&gt;
     String _second;&lt;br /&gt;
   &lt;br /&gt;
     String get second {&lt;br /&gt;
         return _second;&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
     void set second(String second) {&lt;br /&gt;
         this._second = second;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 void main() {&lt;br /&gt;
     A a = new A();&lt;br /&gt;
     a.first = 'x';&lt;br /&gt;
     a.second = 'y';&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Více viz: [https://www.woolha.com/tutorials/dart-using-access-modifiers-private-public Woolha.com &amp;gt; Dart using Access Modifiers] a [https://www.fluttersolution.com/2023/04/understanding-access-modifiers-in-dart.html FlutterSolution &amp;gt; Understanding Access Modifiers in Dart].&lt;br /&gt;
&lt;br /&gt;
=== Zkrácený zápis metod s návratovou hodnotou ===&lt;br /&gt;
* Pro krátké metody můžeme využít syntaxi s&amp;amp;nbsp;&amp;lt;code&amp;gt;=&amp;gt;&amp;lt;/code&amp;gt;:&lt;br /&gt;
 class Osoba {&lt;br /&gt;
    String _name = &amp;quot;Karel&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
    String get name =&amp;gt; _name;&lt;br /&gt;
    set name(String name) =&amp;gt; _name = name;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void main() {&lt;br /&gt;
   Osoba osoba = new Osoba();&lt;br /&gt;
   osoba.name = &amp;quot;Ivan&amp;quot;;&lt;br /&gt;
   print(osoba.name);&lt;br /&gt;
 }&lt;br /&gt;
Místo delšího:&lt;br /&gt;
 //...&lt;br /&gt;
 String get getName {&lt;br /&gt;
    return _name;&lt;br /&gt;
 }&lt;br /&gt;
 void set setName(String name) {&lt;br /&gt;
    _name = name;&lt;br /&gt;
 }&lt;br /&gt;
 //...&lt;br /&gt;
&lt;br /&gt;
== Parametry metod ==&lt;br /&gt;
* Poziční (''position'') parametry metod píšeme stejně jako v&amp;amp;nbsp;Javě:&lt;br /&gt;
&lt;br /&gt;
 void metoda(String text, int cislo) { ... }&lt;br /&gt;
 &lt;br /&gt;
 metoda('Text', 30); &lt;br /&gt;
&lt;br /&gt;
* Lze ale také použít pojmenované parametry (''named''). Potom nezáleží na pořadí argumentů, ale každý z&amp;amp;nbsp;argumentů musí být uvozen názvem:&lt;br /&gt;
&lt;br /&gt;
 void metoda({required String text, required int cislo}) { ... }&lt;br /&gt;
 &lt;br /&gt;
 metoda(cislo: 30, text: 'Text'); &lt;br /&gt;
 metoda(text: 'Text', cislo: 30); &lt;br /&gt;
&lt;br /&gt;
* Lze také uvést výchozí hodnotu parametru. Pak se jedná o volitelný (''optional'') parametr, který nemusíme uvádět. &lt;br /&gt;
&lt;br /&gt;
Viz také: [https://blog.stackademic.com/dart-function-parameters-in-flutter-positional-vs-named-with-examples-fc475da97f7c StackAcademic.com &amp;gt; Dart Function Parameters in Flutter].&lt;br /&gt;
&lt;br /&gt;
== Výjimky a jejich řešení ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; může vyhazovat obecně libovolný datový typ. (Ne, že by byl až tak dobrý nápad vyhazovat něco, co není potomek &amp;lt;code&amp;gt;Exception&amp;lt;/code&amp;gt;.)&lt;br /&gt;
* Odchycení výjimky:&lt;br /&gt;
 try {&lt;br /&gt;
    // Kód, kde může nastat chyba&lt;br /&gt;
 } on XYException catch (ex) {&lt;br /&gt;
    // Ošetření chyby typu XYException&lt;br /&gt;
 } on Exception catch (ex) {&lt;br /&gt;
    // Ošetření všech chyb, které jsou potomky Exception&lt;br /&gt;
 } catch (error) {&lt;br /&gt;
    // Ošetření všech ostatních chyb - nejen těch, které vyhazují Exception.&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Komentáře ==&lt;br /&gt;
* Jednořádkové a víceřádkové komentáře se píší stejně jako v&amp;amp;nbsp;Javě:&lt;br /&gt;
 // One-line comment&lt;br /&gt;
 /* Multi-line/inline comment */&lt;br /&gt;
&lt;br /&gt;
* Dokumentační komentář se uvozuje třemi lomítky jako v C# (lze použít i notaci z&amp;amp;nbsp;Javy, ale není doporučovaná):&lt;br /&gt;
 /// Saturated water pressure according to Antoine equation&lt;br /&gt;
 /// Depends on outer [temperatureC] in degrees of Celsius.&lt;br /&gt;
 double saturatedWaterPressureAntoine(double temperatureC) {&lt;br /&gt;
   /// Compute exponent using [Math.pow()] function:&lt;br /&gt;
   return pow(10, (8.07131 - (1730.63/(233.426 + temperatureC)))) as double;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Style: konvence pojmenování ==&lt;br /&gt;
&lt;br /&gt;
; PascalCase (UpperCamelCase)&lt;br /&gt;
* Názvy tříd&lt;br /&gt;
* Názvy výčtových typů&lt;br /&gt;
&lt;br /&gt;
 class Customer { ... }&lt;br /&gt;
&lt;br /&gt;
; lowercase_with_underscores&lt;br /&gt;
* Názvy souborů&lt;br /&gt;
* Název projektu/aplikace&lt;br /&gt;
* Názvy prefixů pro import&lt;br /&gt;
&lt;br /&gt;
Cílem je zajistit kompatibilitu s&amp;amp;nbsp;různými souborovými systémy, které nemusí rozlišovat velká a malá písmena (case-insensitive).&lt;br /&gt;
&lt;br /&gt;
; camelCase (LowerCamelCase)&lt;br /&gt;
* Všechno ostatní ;)&lt;br /&gt;
* Na rozdíl od Javy se doporučuje i pro pojmenování konstant. (Z&amp;amp;nbsp;hlediska konzistence s&amp;amp;nbsp;existujícími knihovnami se povoluje i SCREAMING_CASE.)&lt;br /&gt;
&lt;br /&gt;
 const defaultTimeout = 1000;&lt;br /&gt;
&lt;br /&gt;
Více o konvencích zápisu kódu viz: [https://dart.dev/effective-dart/style Dart.dev &amp;amp;rarr; Style].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Související stránky ==&lt;br /&gt;
* [[Flutter: Kostra aplikace]]&lt;br /&gt;
* [[Flutter: Základní widgety]]&lt;br /&gt;
* [[Dart: Užitečné tipy]]&lt;br /&gt;
* Další stránky v [[:Category:Flutter|kategorii Flutter]]&lt;/div&gt;</summary>
		<author><name>Spravce</name></author>	</entry>

	</feed>