up
8
.mermaid-config.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"theme": "neutral",
|
||||
"fontFamily": "Times New Roman",
|
||||
"actorFontFamily": "Times New Roman",
|
||||
"noteFontFamily": "Times New Roman",
|
||||
"messageFontFamily": "Times New Roman",
|
||||
"personFontFamily": "Times New Roman"
|
||||
}
|
18
.vscode/settings.json
vendored
@ -1,11 +1,13 @@
|
||||
{
|
||||
"folder-path-color.folders": [
|
||||
{ "path": "chapters/01", "symbol": "SR", "tooltip": "Source files" },
|
||||
{ "path": "chapters/02", "symbol": "T", "tooltip": "Common" },
|
||||
{ "path": "chapters/03", "symbol": "T", "tooltip": "Common" },
|
||||
{ "path": "chapters/04", "symbol": "T", "tooltip": "Common" },
|
||||
{ "path": "chapters/05", "symbol": "T", "tooltip": "Common" },
|
||||
{ "path": "chapters/06", "symbol": "T", "tooltip": "Common" },
|
||||
{ "path": "chapters/07", "symbol": "T", "tooltip": "Common" },
|
||||
]
|
||||
{ "path": "chapters/01", "symbol": "SR", "tooltip": "01" },
|
||||
{ "path": "chapters/02", "symbol": "T", "tooltip": "02" },
|
||||
{ "path": "chapters/03", "symbol": "T", "tooltip": "03" },
|
||||
{ "path": "chapters/04", "symbol": "T", "tooltip": "04" },
|
||||
{ "path": "chapters/05", "symbol": "T", "tooltip": "05" },
|
||||
{ "path": "chapters/06", "symbol": "T", "tooltip": "06" },
|
||||
{ "path": "chapters/07", "symbol": "T", "tooltip": "07" }
|
||||
],
|
||||
"cSpell.enabled": true,
|
||||
"cSpell.enableFiletypes": ["markdown_latex_combined"]
|
||||
}
|
16
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "make",
|
||||
"type": "shell",
|
||||
"command": "make",
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
339
Bachelor.bib
@ -1,3 +1,25 @@
|
||||
@online{0andriyAnswerWhatMinimum2015,
|
||||
title = {Answer to "{{What}} Is the Minimum Amount of {{RAM}} Required to Run {{Linux}} Kernel on an {{Embedded}} Device?"},
|
||||
shorttitle = {Answer to "{{What}} Is the Minimum Amount of {{RAM}} Required to Run {{Linux}} Kernel on an {{Embedded}} Device?},
|
||||
author = {0andriy},
|
||||
date = {2015-01-14},
|
||||
url = {https://stackoverflow.com/a/27950451},
|
||||
urldate = {2024-02-19},
|
||||
organization = {{Stack Overflow}},
|
||||
file = {/Users/fabian/Zotero/storage/HNIIPU6S/what-is-the-minimum-amount-of-ram-required-to-run-linux-kernel-on-an-embedded-de.html}
|
||||
}
|
||||
|
||||
@online{3ClauseBSDLicense2011,
|
||||
title = {The 3-{{Clause BSD License}}},
|
||||
date = {2011-05-22T22:21:11+00:00},
|
||||
url = {https://opensource.org/license/bsd-3-clause/},
|
||||
urldate = {2024-02-18},
|
||||
abstract = {Note: This license has also been called the “New BSD License” or “Modified BSD License”. See also the 2-clause BSD License. Copyright {$<$}YEAR{$>$} {$<$}COPYRIGHT HOLDER{$>$} R…},
|
||||
langid = {american},
|
||||
organization = {{Open Source Initiative}},
|
||||
file = {/Users/fabian/Zotero/storage/ZHWXNYXB/bsd-3-clause.html}
|
||||
}
|
||||
|
||||
@online{bizzottoComparisonPopularFlutter2023,
|
||||
title = {A {{Comparison}} of {{Popular Flutter App Architectures}}},
|
||||
author = {Bizzotto, Andrea},
|
||||
@ -10,6 +32,53 @@
|
||||
file = {/Users/fabian/Zotero/storage/DUDXBAGD/comparison-flutter-app-architectures.html}
|
||||
}
|
||||
|
||||
@article{dechenshawSystemsSystemsCyberPhysical2016,
|
||||
title = {Systems of {{Systems}}, {{Cyber-Physical Systems}}, the {{Internet-of-Things}}…whatever {{Next}}?},
|
||||
author = {family=C Henshaw, given=Michael J., prefix=de, useprefix=true},
|
||||
date = {2016},
|
||||
journaltitle = {INSIGHT},
|
||||
volume = {19},
|
||||
number = {3},
|
||||
pages = {51--54},
|
||||
issn = {2156-4868},
|
||||
doi = {10.1002/inst.12109},
|
||||
url = {https://onlinelibrary.wiley.com/doi/abs/10.1002/inst.12109},
|
||||
urldate = {2024-02-15},
|
||||
abstract = {This paper considers the concepts of systems of systems, cyber-physical systems, and the Internet-of-things. Although originating from different domains and perspectives, there is considerable convergence of the three concepts in terms of future complex systems, and it is concluded that the Internet-of-things is essentially a cyber-physical system of systems which will require new approaches in systems engineering to be developed.},
|
||||
langid = {english},
|
||||
file = {/Users/fabian/Zotero/storage/L4V53253/inst.html}
|
||||
}
|
||||
|
||||
@article{dibattistaModellingDiseaseTransmission,
|
||||
title = {Modelling Disease Transmission from Touchscreen User Interfaces},
|
||||
author = {Di Battista, Andrew and Nicolaides, Christos and Georgiou, Orestis},
|
||||
journaltitle = {Royal Society Open Science},
|
||||
shortjournal = {R Soc Open Sci},
|
||||
volume = {8},
|
||||
number = {7},
|
||||
eprint = {34350020},
|
||||
eprinttype = {pmid},
|
||||
pages = {210625},
|
||||
issn = {2054-5703},
|
||||
doi = {10.1098/rsos.210625},
|
||||
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8316822/},
|
||||
urldate = {2024-02-22},
|
||||
abstract = {The extensive use of touchscreens for all manner of human–computer interactions has made them plausible instruments of touch-mediated disease transmission. To that end, we employ stochastic simulations to model human–fomite interaction with a distinct focus on touchscreen interfaces. The timings and frequency of interactions from within a closed population of infectious and susceptible individuals was modelled using a queuing network. A pseudo-reproductive number R was used to compare outcomes under various parameter conditions. We then apply the simulation to a specific real-world scenario; namely that of airport self-check-in and baggage drop. A counterintuitive result was that R decreased with increased touch rates required for touchscreen interaction. Additionally, as one of few parameters to be controlled, the rate of cleaning/disinfecting screens plays an essential role in mitigating R, though alternative technological strategies could prove more effective. The simulation model developed provides a foundation for future advances in more sophisticated fomite disease-transmission modelling.},
|
||||
pmcid = {PMC8316822},
|
||||
file = {/Users/fabian/Zotero/storage/UY4WG89R/Di Battista et al_Modelling disease transmission from touchscreen user interfaces.pdf}
|
||||
}
|
||||
|
||||
@online{dikkyryanpratamaWhatLinuxDistribution,
|
||||
title = {What {{Is Linux Distribution}}?},
|
||||
author = {{Dikky Ryan Pratama}},
|
||||
url = {https://www.alibabacloud.com/blog/what-is-linux-distribution_599979},
|
||||
urldate = {2024-02-22},
|
||||
abstract = {The article explains what a Linux distribution is, its main characteristics and components, how it caters to a wide range of users and purposes.},
|
||||
langid = {english},
|
||||
organization = {{Alibaba Cloud Community}},
|
||||
file = {/Users/fabian/Zotero/storage/LAGSLH4P/what-is-linux-distribution_599979.html}
|
||||
}
|
||||
|
||||
@online{FlutterArchitecturalOverviewb,
|
||||
title = {Flutter Architectural Overview},
|
||||
url = {https://docs.flutter.dev/resources/architectural-overview},
|
||||
@ -28,8 +97,62 @@
|
||||
file = {/Users/fabian/Zotero/storage/V9T5LLK6/inside-flutter.html}
|
||||
}
|
||||
|
||||
@online{IntroductionDeclarativeUI,
|
||||
@online{FlutterGPU,
|
||||
title = {Flutter {{GPU}}},
|
||||
url = {https://github.com/flutter/flutter/wiki/Flutter-GPU},
|
||||
urldate = {2024-02-15},
|
||||
abstract = {Flutter makes it easy and fast to build beautiful apps for mobile and beyond - flutter/flutter},
|
||||
langid = {english},
|
||||
organization = {{GitHub}},
|
||||
file = {/Users/fabian/Zotero/storage/VVZT5YJA/Flutter-GPU.html}
|
||||
}
|
||||
|
||||
@online{FlutterWeiSuoYouPingMuChuangZaoJingCai,
|
||||
title = {Flutter: 为所有屏幕创造精彩},
|
||||
shorttitle = {Flutter},
|
||||
url = {https://flutter.cn/},
|
||||
urldate = {2024-02-23},
|
||||
abstract = {Flutter 官方文档中文版,包含 SDK 下载、最新特性介绍、代码示例、开发文档、中文社区等内容。},
|
||||
langid = {chinese}
|
||||
}
|
||||
|
||||
@online{ganssleWhatEmbedded2008,
|
||||
title = {What's {{Embedded}}?},
|
||||
author = {Ganssle, Jack},
|
||||
date = {2008-03-17T13:06:00+00:00},
|
||||
url = {https://www.embedded.com/whats-embedded/},
|
||||
urldate = {2024-02-22},
|
||||
abstract = {At the 2004 ESC Wind River's Jerry Fiddler claimed that there is no real embedded systems market. He felt that it was all about "the device," and in},
|
||||
langid = {american},
|
||||
organization = {{Embedded.com}},
|
||||
file = {/Users/fabian/Zotero/storage/XNVLRL6Q/whats-embedded.html}
|
||||
}
|
||||
|
||||
@online{gardeFlutterRaspberryPi2018,
|
||||
title = {Flutter on {{Raspberry Pi}} (Mostly) from {{Scratch}}},
|
||||
author = {Garde, Chinmay},
|
||||
date = {2018-11-30T11:44:00},
|
||||
url = {https://medium.com/flutter/flutter-on-raspberry-pi-mostly-from-scratch-2824c5e7dcb1},
|
||||
urldate = {2023-11-13},
|
||||
abstract = {This document describes an experiment in porting the Flutter engine to a target that is currently not supported. That fact that I used a…},
|
||||
langid = {english},
|
||||
organization = {{Flutter}},
|
||||
file = {/Users/fabian/Zotero/storage/3K7HX2EI/flutter-on-raspberry-pi-mostly-from-scratch-2824c5e7dcb1.html}
|
||||
}
|
||||
|
||||
@online{googleinc.FutterBuildAny,
|
||||
title = {Futter - {{Build}} for Any Screen},
|
||||
author = {{Google Inc.}},
|
||||
url = {https://flutter.dev/},
|
||||
urldate = {2024-02-22},
|
||||
abstract = {Flutter transforms the entire app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase.},
|
||||
langid = {english},
|
||||
file = {/Users/fabian/Zotero/storage/FUSDYG34/flutter.dev.html}
|
||||
}
|
||||
|
||||
@online{googleinc.IntroductionDeclarativeUI,
|
||||
title = {Introduction to Declarative {{UI}}},
|
||||
author = {{Google Inc.}},
|
||||
url = {https://docs.flutter.dev/get-started/flutter-for/declarative},
|
||||
urldate = {2024-02-13},
|
||||
abstract = {Explains the difference between a declarative and imperative programming style.},
|
||||
@ -37,6 +160,101 @@
|
||||
file = {/Users/fabian/Zotero/storage/F6LI3FTY/declarative.html}
|
||||
}
|
||||
|
||||
@book{hajianFlutterEngineering2024,
|
||||
title = {Flutter Engineering},
|
||||
author = {Hajian, Majid},
|
||||
date = {2024-01-18},
|
||||
publisher = {{Staten House}},
|
||||
abstract = {Become a Flutter professional using tactics explained from a software engineer's perspective.This book covers various software engineering topics in Flutter and is divided into five parts, each addressing specific areas of interest and expertise.Foundation of Flutter Engineering introduces software engineering concepts specifically relevant to Flutter. It starts by explaining the fundamental principles of Flutter and how they work and then moves on to demonstrate how these concepts can be applied within the Flutter framework. This section also covers coding design patterns that help readers develop a foundational understanding of the subject matter.Architecture: beginning with basic principles and progressing onto different styles and patterns in architectural design. It covers essential concepts such as concurrency, parallelism, dependency injection, and state management. Additionally, this section explores the architectural factors involved in developing offline apps, guiding readers on strategic thinking and decision-making in software architecture.Processes part covers rules and guidelines, continuous delivery and integration, testing methodologies, and effective documentation practices in a comprehensive manner. This section gives readers the knowledge needed to streamline and efficiently develop apps.Ethical Engineering discusses the OWASP Top 10 security risks, privacy standards, and accessibility considerations. The section emphasizes creating inclusive and secure applications that value user privacy.Advancing UI Development explores adaptive and responsive UIs and sophisticated topics like custom painting, shaders, internationalization, localization, and effective theming in Flutter. This section enhances the reader’s skills in creating visually appealing and user-friendly interfaces.Whether a beginner or an experienced developer, this book can offer you something to learn.},
|
||||
isbn = {9798889405528},
|
||||
langid = {Englisch},
|
||||
pagetotal = {547}
|
||||
}
|
||||
|
||||
@book{heathEmbeddedSystemsDesign2002,
|
||||
title = {Embedded Systems Design},
|
||||
author = {Heath, Steve},
|
||||
date = {2002},
|
||||
publisher = {{Elsevier}},
|
||||
isbn = {0-08-047756-9}
|
||||
}
|
||||
|
||||
@online{HowGitObject,
|
||||
title = {How {{Git}} Object Deduplication Works in {{GitLab}} | {{GitLab}}},
|
||||
url = {https://docs.gitlab.com/ee/development/git_object_deduplication.html},
|
||||
urldate = {2024-02-19},
|
||||
abstract = {GitLab product documentation.},
|
||||
langid = {american},
|
||||
file = {/Users/fabian/Zotero/storage/4GAFAAXS/git_object_deduplication.html}
|
||||
}
|
||||
|
||||
@online{IntroductionDeclarativeUIa,
|
||||
title = {Introduction to Declarative {{UI}}},
|
||||
url = {https://docs.flutter.dev/get-started/flutter-for/declarative},
|
||||
urldate = {2024-02-18},
|
||||
abstract = {Explains the difference between a declarative and imperative programming style.},
|
||||
langid = {english},
|
||||
file = {/Users/fabian/Zotero/storage/HRKBSWAK/declarative.html}
|
||||
}
|
||||
|
||||
@letter{itoYoctoTimeZone2018,
|
||||
type = {E-mail},
|
||||
title = {[Yocto] Time Zone},
|
||||
author = {Ito, Takayasu},
|
||||
year = {Wed Oct 24 17:56:10 PDT 2018},
|
||||
url = {https://docs.yoctoproject.org/pipermail/yocto/2018-October/042964.html},
|
||||
urldate = {2024-03-04},
|
||||
file = {/Users/fabian/Zotero/storage/5RDNK486/042964.html}
|
||||
}
|
||||
|
||||
@article{korogluComparisonKeypadsTouchscreen2015,
|
||||
title = {Comparison of Keypads and Touch-Screen Mobile Phones/Devices as Potential Risk for Microbial Contamination},
|
||||
author = {Koroglu, Mehmet and Gunal, Selami and Yildiz, Fatma and Savas, Mehtap and Ozer, Ali and Altindis, Mustafa},
|
||||
date = {2015-12-30},
|
||||
journaltitle = {Journal of Infection in Developing Countries},
|
||||
shortjournal = {J Infect Dev Ctries},
|
||||
volume = {9},
|
||||
number = {12},
|
||||
eprint = {26719936},
|
||||
eprinttype = {pmid},
|
||||
pages = {1308--1314},
|
||||
issn = {1972-2680},
|
||||
doi = {10.3855/jidc.6171},
|
||||
abstract = {INTRODUCTION: Touch-screen mobile phones/devices (TMPs/Ds) are increasingly used in hospitals. They may act as a mobile reservoir for microbial pathogens. The rates of microbial contamination of TMPs/Ds and keypad mobile phones (KMPs) with respect to different variables including use by healthcare workers (HCWs)/non-HCWs and the demographic characteristics of users were investigated. METHODOLOGY: A total of 205 mobile phones/devices were screened for microbial contamination: 76 devices belonged to HCWs and 129 devices belonged to the non-HCW group. By rubbing swabs to front screen, back, keypad, and metallic surfaces of devices, 444 samples were collected. RESULTS: Of 205 mobile phones/devices, 143 (97.9\%) of the TMPs/Ds and 58 (98.3\%) of the KMPs were positive for microbial contamination, and there were no significant differences in contamination rates between these groups, although TMPs/Ds had significantly higher microbial load than KMPs (p {$<$}0.05). The significant difference in this analysis was attributable to the screen size of mobile phones ≥ 5". Microbial contamination rates increased significantly as phone size increased (p {$<$}0.05). Higher numbers of coagulase-negative Staphylococci (CNS) were isolated from KMPs than TMPs/Ds (p = 0.049). The incidence of Enterococcus spp. was higher on the KMPs of HCWs, and methicillin resistant CNS was higher from the TMPs/Ds of non-HCWs (p {$<$}0.05). Isolation of CNS, Streptococcus spp. and Escherichia coli was higher from the TMPs/Ds of HCWs (p {$<$}0.05). CONCLUSIONS: We found no significant difference between TMP/Ds and KMPs in terms of microbial contamination, but TMP/Ds harboured more colonies and total microbial counts increased with screen size.},
|
||||
langid = {english},
|
||||
keywords = {Adult,Bacteria,Cross-Sectional Studies,Environmental Microbiology,Equipment Contamination,Fungi,Health Personnel,Hospitals,Humans,Male,Middle Aged,Prospective Studies,Telecommunications,Young Adult},
|
||||
file = {/Users/fabian/Zotero/storage/TFSCZX36/Koroglu et al_2015_Comparison of keypads and touch-screen mobile phones-devices as potential risk.pdf}
|
||||
}
|
||||
|
||||
@book{leeIntroductionEmbeddedSystems2016,
|
||||
title = {Introduction to Embedded Systems: {{A}} Cyber-Physical Systems Approach},
|
||||
author = {Lee, Edward Ashford and Seshia, Sanjit Arunkumar},
|
||||
date = {2016},
|
||||
publisher = {{MIT press}},
|
||||
isbn = {0-262-53381-2}
|
||||
}
|
||||
|
||||
@article{leePresentFutureCyberPhysical2015,
|
||||
title = {The {{Past}}, {{Present}} and {{Future}} of {{Cyber-Physical Systems}}: {{A Focus}} on {{Models}}},
|
||||
shorttitle = {The {{Past}}, {{Present}} and {{Future}} of {{Cyber-Physical Systems}}},
|
||||
author = {Lee, Edward A.},
|
||||
date = {2015-03},
|
||||
journaltitle = {Sensors},
|
||||
volume = {15},
|
||||
number = {3},
|
||||
pages = {4837--4869},
|
||||
publisher = {{Multidisciplinary Digital Publishing Institute}},
|
||||
issn = {1424-8220},
|
||||
doi = {10.3390/s150304837},
|
||||
url = {https://www.mdpi.com/1424-8220/15/3/4837},
|
||||
urldate = {2024-02-15},
|
||||
abstract = {This paper is about better engineering of cyber-physical systems (CPSs) through better models. Deterministic models have historically proven extremely useful and arguably form the kingpin of the industrial revolution and the digital and information technology revolutions. Key deterministic models that have proven successful include differential equations, synchronous digital logic and single-threaded imperative programs. Cyber-physical systems, however, combine these models in such a way that determinism is not preserved. Two projects show that deterministic CPS models with faithful physical realizations are possible and practical. The first project is PRET, which shows that the timing precision of synchronous digital logic can be practically made available at the software level of abstraction. The second project is Ptides (programming temporally-integrated distributed embedded systems), which shows that deterministic models for distributed cyber-physical systems have practical faithful realizations. These projects are existence proofs that deterministic CPS models are possible and practical.},
|
||||
issue = {3},
|
||||
langid = {english},
|
||||
keywords = {clock synchronization,cyber-physical systems,distributed systems,PRET machines,real-time systems,time synchronization},
|
||||
file = {/Users/fabian/Zotero/storage/IGCKHF3Y/Lee_2015_The Past, Present and Future of Cyber-Physical Systems.pdf}
|
||||
}
|
||||
|
||||
@online{linuxfoundationYoctoProject162024,
|
||||
title = {The {{Yocto Project}} ® 4.0.16 Documentation},
|
||||
author = {{Linux Foundation}},
|
||||
@ -46,6 +264,62 @@
|
||||
file = {/Users/fabian/Zotero/storage/WWAQWEK2/singleindex.html}
|
||||
}
|
||||
|
||||
@book{marwedelEmbeddedSystemDesign2021,
|
||||
title = {Embedded System Design: Embedded Systems Foundations of Cyber-Physical Systems, and the Internet of Things},
|
||||
author = {Marwedel, Peter},
|
||||
date = {2021},
|
||||
publisher = {{Springer Nature}},
|
||||
isbn = {3-030-60910-3}
|
||||
}
|
||||
|
||||
@article{oszutowska-mazurekAssociationsKnowledgeBehaviours2021,
|
||||
title = {The {{Associations}} between {{Knowledge}} and {{Behaviours Related}} to {{Touch Screens}} and {{Microbiological Threats}} among {{IT Students}}’},
|
||||
author = {Oszutowska-Mazurek, Dorota and Fastowicz, Jaroslaw and Mazurek, Przemyslaw},
|
||||
date = {2021-09-02},
|
||||
journaltitle = {International Journal of Environmental Research and Public Health},
|
||||
shortjournal = {Int J Environ Res Public Health},
|
||||
volume = {18},
|
||||
number = {17},
|
||||
eprint = {34501860},
|
||||
eprinttype = {pmid},
|
||||
pages = {9269},
|
||||
issn = {1661-7827},
|
||||
doi = {10.3390/ijerph18179269},
|
||||
url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8431698/},
|
||||
urldate = {2024-02-22},
|
||||
abstract = {Current issue like the COVID–19 pandemic show how elementary knowledge and hygiene behaviours are important for ordinary people. Microbiological hazards, not just viruses, can be transmitted in various ways through touch screens. For ordinary users, there is a wide range of behaviours that affect the ability to transfer microbial hazards (viruses, bacteria and fungi). The purpose of the paper is to analyse the association between knowledge and behaviour of touch screen users based on surveys. This paper presents selected results of a survey conducted at the end of 2019 (pre–COVID–19 survey). The survey was conducted on a group of 172 IT school students. The relationship between responses using a 2D linear model regression and clustering is used. Most respondents believe that bacteria were more common than viruses on touch screens. The respondents declare altruism in terms of a greater willingness to lend their smartphone, rather than to use someone else’s. An interesting result is that respondents often lend their smartphone to others, while being aware that viruses or bacteria are present on the touch screens. The results can be used in terms of changes in the education process of smartphone users in relation to microbiological hazards.},
|
||||
pmcid = {PMC8431698},
|
||||
file = {/Users/fabian/Zotero/storage/4GH3EW8M/Oszutowska-Mazurek et al_2021_The Associations between Knowledge and Behaviours Related to Touch Screens and.pdf}
|
||||
}
|
||||
|
||||
@article{palKeypadMobilePhones2013,
|
||||
title = {Keypad Mobile Phones Are Associated with a Significant Increased Risk of Microbial Contamination Compared to Touch Screen Phones},
|
||||
author = {Pal, Pallavi and Roy, Ashoke and Moore, Ginny and Muzslay, Monika and Lee, Elaine and Alder, Sarah and Wilson, Peter and Powles, Tom and Wilson, Peter and Kelly, John},
|
||||
date = {2013-03-01},
|
||||
journaltitle = {Journal of Infection Prevention},
|
||||
shortjournal = {Journal of Infection Prevention},
|
||||
volume = {14},
|
||||
number = {2},
|
||||
pages = {65--68},
|
||||
publisher = {{SAGE Publications}},
|
||||
issn = {1757-1774},
|
||||
doi = {10.1177/1757177413475903},
|
||||
url = {https://doi.org/10.1177/1757177413475903},
|
||||
urldate = {2024-02-22},
|
||||
abstract = {The use of mobile phones in the clinical environment by healthcare workers has become widespread. Despite evidence that these devices can harbour pathogenic micro-organisms there is little guidance on how to reduce contamination. Recently touchscreen phones with a single flat surface have been introduced. We hypothesise that bacterial contamination of phones used in hospitals will be lower on touchscreen devices compared to keypad devices. Sixty seven mobile phones belonging to health care workers were sampled. The median colony count for touchscreen phones and keypad devices was 0·09 colony forming units (cfu)/cm2 (interquartile range (IQR) 0.05–0·14) and 0·77 cfu/cm2 (IQR range 0·45–3.52) respectively. Colony counts were significantly higher on the keypad phones (Fisher’s exact test p{$<$}0.001). Multivariate analysis showed the type of phone (keypad vs. touch screen) was associated with increased colony counts (F-statistic 14.13: p{$<$}0.001). Overall, nine (13\%) phones grew either meticillin resistant Staphylococcus aureus or vancomycin resistant enterococci. Eight (24\%) keypad phones were contaminated with these organisms compared with one touch screen phone (3\%). Our data indicate that touchscreen mobile phones are less contaminated than their keypad counterparts, and they are less likely to harbour pathogenic bacteria in the clinical setting.},
|
||||
langid = {english},
|
||||
file = {/Users/fabian/Zotero/storage/44QLMR8K/Pal et al_2013_Keypad mobile phones are associated with a significant increased risk of.pdf}
|
||||
}
|
||||
|
||||
@online{Puro,
|
||||
title = {Puro},
|
||||
url = {https://puro.dev/},
|
||||
urldate = {2024-02-20},
|
||||
abstract = {A comments widget built on GitHub Discussions.},
|
||||
langid = {english},
|
||||
file = {/Users/fabian/Zotero/storage/GEQ4Q3EP/widget.html}
|
||||
}
|
||||
|
||||
@online{ReactiveManifesto,
|
||||
title = {The {{Reactive Manifesto}}},
|
||||
url = {https://www.reactivemanifesto.org/},
|
||||
@ -53,6 +327,32 @@
|
||||
file = {/Users/fabian/Zotero/storage/FJSMEDYJ/www.reactivemanifesto.org.html}
|
||||
}
|
||||
|
||||
@online{ReleaseV0Rev,
|
||||
title = {Release v0.0.6: {{Rev}} Alpha Branch Version to 0.0.6, Flutter 0.0.26 (\#10010) · Flutter/Flutter},
|
||||
shorttitle = {Release v0.0.6},
|
||||
url = {https://github.com/flutter/flutter/releases/tag/v0.0.6},
|
||||
urldate = {2024-02-18},
|
||||
abstract = {VERSION: 0.0.6 flutter: 0.0.26 flutter\_driver: 0.0.4 flutter\_test: 0.0.4},
|
||||
langid = {english},
|
||||
organization = {{GitHub}},
|
||||
file = {/Users/fabian/Zotero/storage/DJJMSGJK/v0.0.html}
|
||||
}
|
||||
|
||||
@online{richardstallmanWhyGNULinux,
|
||||
title = {Why {{GNU}}/{{Linux}}?},
|
||||
author = {{Richard Stallman}},
|
||||
url = {https://www.gnu.org/gnu/why-gnu-linux.en.html},
|
||||
urldate = {2024-02-19},
|
||||
file = {/Users/fabian/Zotero/storage/4YEIHLEH/why-gnu-linux.en.html}
|
||||
}
|
||||
|
||||
@online{RpifirmwareAddFirmware,
|
||||
title = {Rpi-Firmware: Add Firmware for Zero 2w by Classabbyamp · {{Pull Request}} \#39123 · Void-Linux/Void-Packages},
|
||||
url = {https://github.com/void-linux/void-packages/pull/39123},
|
||||
urldate = {2024-02-23},
|
||||
file = {/Users/fabian/Zotero/storage/QWUKGL4U/39123.html}
|
||||
}
|
||||
|
||||
@online{Skia,
|
||||
title = {Skia},
|
||||
url = {https://skia.org/},
|
||||
@ -63,6 +363,17 @@
|
||||
file = {/Users/fabian/Zotero/storage/NV4BSHXY/skia.org.html}
|
||||
}
|
||||
|
||||
@online{theflutterauthorsEngineShellPlatform,
|
||||
title = {Engine/Shell/Platform/Embedder/Embedder.h at 436f9707b94774d1d049c04b8cda9d81d85aa4a8 · Flutter/Engine},
|
||||
author = {{The Flutter Authors}},
|
||||
url = {https://github.com/flutter/engine/blob/436f9707b94774d1d049c04b8cda9d81d85aa4a8/shell/platform/embedder/embedder.h},
|
||||
urldate = {2024-02-22},
|
||||
abstract = {The Flutter engine. Contribute to flutter/engine development by creating an account on GitHub.},
|
||||
langid = {english},
|
||||
organization = {{GitHub}},
|
||||
file = {/Users/fabian/Zotero/storage/SQZ53EIM/embedder.html}
|
||||
}
|
||||
|
||||
@video{theflutterwayFlutterRubberDuck2022,
|
||||
entrysubtype = {video},
|
||||
title = {Before {{Flutter}} | {{Rubber Duck Engineering}} | {{Episode}} \#100},
|
||||
@ -74,6 +385,19 @@
|
||||
abstract = {Tonight we'll talk about the years leading up to Flutter and how Adam and I worked on a variety of projects for the web which inspired what Flutter would become, including at least 3 frameworks in JS, how we briefly thought "shake to reload" was our killer feature, how for more than the first 6 months of the project Flutter was DOM-based and network loaded and much more. Gonna be amazing. Slides: https://docs.google.com/presentation/...}
|
||||
}
|
||||
|
||||
@online{valleyWhatLinuxOverview2020,
|
||||
title = {What {{Is Linux}}: {{An Overview}} of the {{Linux Operating System}}},
|
||||
shorttitle = {What {{Is Linux}}},
|
||||
author = {family=valley, given=The, prefix=info, useprefix=false},
|
||||
date = {2020-04-11T14:46:55},
|
||||
url = {https://medium.com/@theinfovalley097/what-is-linux-an-overview-of-the-linux-operating-system-77bc7421c7e5},
|
||||
urldate = {2024-02-19},
|
||||
abstract = {What is Linux: An Overview of the Linux Operating System},
|
||||
langid = {english},
|
||||
organization = {{Medium}},
|
||||
file = {/Users/fabian/Zotero/storage/L97SMPU5/what-is-linux-an-overview-of-the-linux-operating-system-77bc7421c7e5.html}
|
||||
}
|
||||
|
||||
@article{weiserComputer21stCentury1999,
|
||||
title = {The Computer for the 21st Century},
|
||||
author = {Weiser, Mark},
|
||||
@ -91,6 +415,13 @@
|
||||
file = {/Users/fabian/Zotero/storage/8CCSE83J/Weiser - 1999 - The computer for the 21st century.pdf}
|
||||
}
|
||||
|
||||
@online{WhatWouldYou,
|
||||
title = {What Would You like to See Most in Minix?},
|
||||
url = {https://groups.google.com/g/comp.os.minix/c/dlNtH7RRrGA/m/SwRavCzVE7gJ},
|
||||
urldate = {2024-02-19},
|
||||
file = {/Users/fabian/Zotero/storage/6TCWJW3N/SwRavCzVE7gJ.html}
|
||||
}
|
||||
|
||||
@online{WorkingJSONFlutter2021,
|
||||
title = {Working with {{JSON}} in {{Flutter While Using}} Json\_annotations and Json\_serializable {{Modules}} in 2022 | {{John Maeda}}’s {{Blog}}},
|
||||
date = {2021-06-22},
|
||||
@ -101,3 +432,9 @@
|
||||
organization = {{https://maeda.pm/}},
|
||||
file = {/Users/fabian/Zotero/storage/ND8L5RU6/working-with-json-in-flutter-while-using-json_annotations-and-json_serializable-modules-in-2022.html}
|
||||
}
|
||||
|
||||
@online{zotero-649,
|
||||
url = {https://tagesschau.api.bund.dev/openapi.yaml},
|
||||
urldate = {2024-03-03},
|
||||
file = {/Users/fabian/Zotero/storage/MBRFKF6W/openapi.html}
|
||||
}
|
||||
|
12
Makefile
@ -1,6 +1,4 @@
|
||||
SHELL:=/bin/bash
|
||||
MARKDOWN_FILES := $(shell find chapters -type f -name "*.md" | sort | tr '\n' ' ')
|
||||
BACHELOR_TEXT := @cat $(MARKDOWN_FILES)
|
||||
export MERMAID_FILTER_FORMAT:=pdf
|
||||
|
||||
all: local
|
||||
|
||||
@ -11,11 +9,15 @@ help:
|
||||
dir:
|
||||
mkdir -p out
|
||||
|
||||
tmp:
|
||||
cat $$(find chapters -type f -name "*.md" | sort) | grep -vw '<!-- prettier-ignore -->' > /tmp/bachelor-build
|
||||
|
||||
|
||||
bachelor: @cat $(MARKDOWN_FILES)
|
||||
|
||||
local: dir
|
||||
local: dir tmp
|
||||
@echo "Building paper"
|
||||
MERMAID_FILTER_FORMAT=pdf pandoc -V colorlinks=true -V linkcolor=black -V urlcolor=black -f 'markdown+autolink_bare_uris' --pdf-engine=lualatex --pdf-engine-opt=-shell-escape --filter mermaid-filter --lua-filter columns.lua --citeproc -s $(MARKDOWN_FILES) -o ./out/bachelor.pdf -V lang=de-DE -V fontsize=11pt --highlight-style tango --reference-links --bibliography Bachelor.bib --csl=harvard-right.csl -M lang:de --number-sections
|
||||
pandoc -f markdown+implicit_figures --strip-comments --listings -V colorlinks=true -V linkcolor=black -V urlcolor=black -f 'markdown+autolink_bare_uris' --pdf-engine=lualatex --pdf-engine-opt=-shell-escape --filter mermaid-filter --filter py-pandoc-include-code --lua-filter columns.lua --citeproc -s /tmp/bachelor-build -o ./out/bachelor.pdf -V lang=de-DE -V fontsize=12pt --reference-links --bibliography Bachelor.bib --csl=harvard-right.csl -M lang:de --number-sections -Vindent=false
|
||||
|
||||
clean:
|
||||
rm -rf out
|
||||
|
3
README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# Flutter als Entwicklungsplattform für eingebettete Linux Systeme
|
||||
|
||||
## Eine Fallstudie
|
BIN
assets/flutter/archdiagram.png
Normal file
After Width: | Height: | Size: 111 KiB |
BIN
assets/mermaid/Caption.pdf
Normal file
BIN
assets/mermaid/Caption.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
chapters/.DS_Store
vendored
@ -1,10 +1,7 @@
|
||||
---
|
||||
header-includes: |
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[usefilenames,RMstyle={Text,Semibold},SSstyle={Text,Semibold},TTstyle={Text,Semibold},DefaultFeatures={Ligatures=Common}]{plex-otf}
|
||||
\usepackage[a4paper,bindingoffset=0.2in,%
|
||||
left=4cm,right=2cm,top=2cm,bottom=2cm,%
|
||||
footskip=.25in]{geometry}
|
||||
\usepackage[a4paper,bindingoffset=0in,left=4cm,right=2cm,top=2cm,bottom=2cm,footskip=.25in]{geometry}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage{tikz}
|
||||
@ -16,7 +13,7 @@ header-includes: |
|
||||
\usepackage{multicol,lipsum}
|
||||
\usepackage{listings}
|
||||
\usepackage{wrapfig}
|
||||
\usepackage[font=small,labelfont=bf]{caption}
|
||||
\usepackage[font=small,labelfont=bf,tableposition=top, position=above]{caption}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{xcolor,stackengine}
|
||||
\usepackage{colortbl}
|
||||
@ -30,8 +27,13 @@ header-includes: |
|
||||
\usepackage{svg}
|
||||
\usepackage{setspace}
|
||||
\usepackage{titling}
|
||||
\usepackage{abstract}
|
||||
\usepackage{fvextra}
|
||||
\usepackage{emoji}
|
||||
\usepackage{fontspec}
|
||||
\usepackage{dirtree}
|
||||
\usepackage{etoolbox}
|
||||
\setmainfont{Times New Roman}
|
||||
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
|
||||
\newcommand{\hideFromPandoc}[1]{#1}
|
||||
\hideFromPandoc{
|
||||
@ -41,15 +43,15 @@ header-includes: |
|
||||
\makeatletter
|
||||
\def\fps@figure{h}
|
||||
\makeatother
|
||||
nocite: |
|
||||
@*
|
||||
---
|
||||
|
||||
\captionsetup[figure]{position=above}
|
||||
|
||||
\setstretch{1.5}
|
||||
|
||||
\setemojifont{Twemoji Mozilla}
|
||||
|
||||
\renewcommand{\familydefault}{\sfdefault}
|
||||
<!-- \renewcommand{\familydefault}{\sfdefault} -->
|
||||
|
||||
\graphicspath{ {./img/} }
|
||||
|
||||
@ -59,6 +61,8 @@ nocite: |
|
||||
|
||||
\renewcommand{\comment}[1]{\hspace{2em}{\small\textit{#1}}\bigskip\par}
|
||||
|
||||
\renewcommand{\lstlistingname}{Auflistung}
|
||||
|
||||
\newcommand\palbox[1]{{\sffamily\fboxsep=5pt\relax\fboxrule=1pt\relax\footnotesize%
|
||||
\fcolorbox{gray!50}{gray!10}{%
|
||||
\stackengine{4pt}{%
|
||||
@ -77,3 +81,8 @@ frame=single,
|
||||
breaklines=true,
|
||||
postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space},
|
||||
}
|
||||
|
||||
\apptocmd{\dirtree}{\bigskip}{}{}
|
||||
\pretocmd{\dirtree}{\bigskip}{}{}
|
||||
|
||||
\newcommand{\mkbibnodate}{n\adddot d\adddot}
|
||||
|
31
chapters/00_pandoc/01_dart.md
Normal file
@ -0,0 +1,31 @@
|
||||
\definecolor{codegreen}{rgb}{0,0.6,0}
|
||||
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
|
||||
\definecolor{codepurple}{rgb}{0.58,0,0.82}
|
||||
\definecolor{backcolour}{rgb}{0.95, 0.95, 0.96}
|
||||
|
||||
\lstset{
|
||||
backgroundcolor=\color{backcolour},
|
||||
commentstyle=\color{codegreen},
|
||||
keywordstyle=\color{magenta},
|
||||
numberstyle=\tiny\color{codegray},
|
||||
stringstyle=\color{codepurple},
|
||||
basicstyle=\ttfamily\footnotesize,
|
||||
breakatwhitespace=false,
|
||||
breaklines=true,
|
||||
captionpos=b,
|
||||
keepspaces=true,
|
||||
numbers=left,
|
||||
numbersep=5pt,
|
||||
showspaces=false,
|
||||
showstringspaces=false,
|
||||
showtabs=false,
|
||||
tabsize=2,
|
||||
morestring=\*[d]{"}
|
||||
}
|
||||
|
||||
\lstset{
|
||||
emph=[1]{var, String, int, List, void, Future, await, if, else, throw, async, true, false},
|
||||
emphstyle=[1]{\color{codepurple}},
|
||||
emph=[2]{findAllElements,findElements, setState, send, fromPath, add, parse, bytesToString},
|
||||
emphstyle=[2]{\color{magenta}}
|
||||
}
|
@ -2,31 +2,39 @@
|
||||
|
||||
\begin{titlepage}
|
||||
\begin{center}
|
||||
\Large Hochschule Rhein-Waal \\
|
||||
\vspace{2.5cm}
|
||||
\Large Proposal für die Bachelorarbeit \\
|
||||
\vspace{2.5cm}
|
||||
\huge \textbf{\textsc{Flutter als Entwicklungsplattform für eingebettete Linux Systeme: eine Fallstudie}} \\
|
||||
\vspace{1.0cm}
|
||||
\Large Fabian Baldeau \\
|
||||
\vspace{2.5cm}
|
||||
\vspace{0.25cm}
|
||||
\textsc{Studiengang}\\
|
||||
\vspace{0.25cm}
|
||||
\textsc{Medieninformatik}\\
|
||||
\vspace{2.5cm}
|
||||
\textsc{Gutachter}\\
|
||||
\vspace{0.25cm}
|
||||
\textsc{Prof. Dr.-Ing. Ido Iurgel}\\
|
||||
\vspace{0.25cm}
|
||||
\textsc{Prof. Dr. Kai Essig}\\
|
||||
Hochschule Rhein-Waal \\
|
||||
Fakultät Kommunikation und Umwelt \\
|
||||
Prof Dr.-Ing. Ido Iurgel \\
|
||||
Prof Dr. Kai Essig \\
|
||||
\vspace{3cm}
|
||||
\Large \textbf{\textsc{Flutter als Entwicklungsplattform für eingebettete Linux Systeme: eine Fallstudie}} \\
|
||||
\vspace{2.0cm}
|
||||
\normalsize Bachelorarbeit \\
|
||||
im Studiengang \\
|
||||
Medieninformatik \\
|
||||
Zur Erlangung des akademischen Grades \\
|
||||
\vspace{2.0cm}
|
||||
Bachelor of Science \\
|
||||
\vspace{2.0cm}
|
||||
vorgelegt von\\
|
||||
Fabian Baldeau \\
|
||||
\vspace{1.5cm}
|
||||
Matrikelnummer: \\
|
||||
27516 \\
|
||||
\vspace{1.5cm}
|
||||
Abgabedatum: \\
|
||||
xx. xxxx 2024 \\
|
||||
\vspace{2cm}
|
||||
\end{center}
|
||||
|
||||
\end{titlepage}
|
||||
|
||||
\pagenumbering{Roman}
|
||||
\pagenumbering{roman}
|
||||
\fancyhf{}
|
||||
\fancyhead[C]{\thepage}
|
||||
|
||||
<!-- \fancyhead[C]{\thepage} -->
|
||||
|
||||
\fancyhead[C]{}
|
||||
\fancyfoot[R]{\thepage}
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\pagestyle{fancy}
|
||||
|
@ -0,0 +1,27 @@
|
||||
\addtocounter{page}{1}
|
||||
|
||||
\begin{abstract}
|
||||
Die Integration von Flutter's plattformübergreifenden
|
||||
UI-Fähigkeiten mit der Anpassungsfähigkeit von Embedded
|
||||
Linux verspricht die Rationalisierung der Entwicklung
|
||||
von Benutzeroberflächen (UIs) für eingebettete Systeme.
|
||||
Diese Arbeit untersucht die Eignung von Flutter in
|
||||
diesem Kontext durch eine Fallstudie: die Entwicklung
|
||||
eines Flutter App Prototyps auf einem Raspberry
|
||||
Pi mit einer angepassten eingebetteten Linux Distribution.
|
||||
Leistungsmesswerte, Benutzerfreundlichkeit und der
|
||||
Entwicklungsprozess werden bewertet. Die Ergebnisse
|
||||
zeigen, dass Flutter, wenn es angepasst wird,
|
||||
erfolgreich zur Erstellung von attraktiven und benutzerfreundlichen
|
||||
eingebetteten Schnittstellen mit wenigen Kompromissen
|
||||
bei der Leistung genutzt werden kann.
|
||||
|
||||
Die Arbeit beschäftigt sich im Wesentlichen mit der Entwicklung einer
|
||||
prototypischen Anwendung mit Flutter für ein eingebettetes Linux System.
|
||||
Dabei wurde ein Konzept ausgearbeitet werden, dass zeigt wie Flutter in
|
||||
eingebetteten Linux Systemen genutzt werden kann und es wurde anhand der
|
||||
prototypischen Anwendung untersucht, wie gut Flutter für diesen
|
||||
Verwendungszweck geeignet ist. Die Ergebnisse der Untersuchung
|
||||
zeigen ein großes Potential für die Nutzung von Flutter in eingebetteten
|
||||
Linux Systemen.
|
||||
\end{abstract}
|
@ -1,6 +1,16 @@
|
||||
\pagebreak
|
||||
\tableofcontents
|
||||
\pagebreak
|
||||
|
||||
\listoffigures
|
||||
|
||||
\pagebreak
|
||||
|
||||
\renewcommand\lstlistlistingname{Auflistungsverzeichnis}
|
||||
\lstlistoflistings
|
||||
|
||||
\pagebreak
|
||||
|
||||
<!-- \fzframelinU{
|
||||
\centering
|
||||
\Huge{Kurz-Exposé} \\
|
||||
|
@ -1 +1,72 @@
|
||||
<!--In der heutigen Zeit verbringen Menschen in der Regel mehr Zeit damit, über einen Bildschirm mit Maschinen zu interagieren, anstatt Maschinen mechanisch zu steuern. Dieser Trend lässt sich gut bei der Automobilindustrie oder an Haushaltsgeräten beobachten, wo immer mehr Funktionen über einen Touchscreen mit einer grafischen Benutzeroberfläche (GUI) angesteuert werden. Über die GUI können Benutzer Funktionen wie Musik, Radio, Telefon, Temperaturregelung und mehr ansteuern. Ebenso kann die Öffentlichkeit am Flughafen oder in Restaurants über einen Selbstbedienungskiosk mit Unternehmen kommunizieren. Der Kiosk führt eine GUI auf einem Anzeigegerät aus und über den Touchscreen des Kiosks können Maschinen die Kundenwünsche erfüllen.-->
|
||||
|
||||
<!--Zusammenfassend lässt sich sagen, dass es in der Industrie einen zunehmenden Trend gibt, dass der Endverbraucher auf bequeme und effiziente Weise mit GUIs interagiert, um Aufgaben zu erledigen.-->
|
||||
|
||||
# Einleitung
|
||||
|
||||
## Motivation
|
||||
|
||||
Die Entwicklung moderner und ansprechender Benutzeroberflächen (GUIs) für eingebettete
|
||||
Linux-Systeme ist eine Herausforderung. Herkömmliche GUI-Toolkits stoßen häufig an
|
||||
ihre Grenzen, wenn es um die Erfüllung der Anforderungen an Leistung,
|
||||
plattformübergreifende Kompatibilität und Design geht. Flutter [@googleinc.FutterBuildAny],
|
||||
ein quelloffenes Benutzerschnittstellen-Entwicklungs-Kit von Google,
|
||||
stellt eine vielversprechende Alternative dar. Es zeichnet sich durch native Kompilierung
|
||||
für hohe Performance und geringen Ressourcenverbrauch, eine flexible Architektur,
|
||||
die an verschiedene Plattformen angepasst werden kann, und seinen Fokus auf moderne
|
||||
und intuitive Benutzeroberflächen aus.
|
||||
|
||||
## Relevanz
|
||||
|
||||
In dieser Arbeit wird der Einsatz von Flutter für die Entwicklung von GUIs für
|
||||
eingebettete Linux-Systeme untersucht. Die Arbeit leistet einen wichtigen Beitrag
|
||||
zu diesem Forschungsbereich, indem sie:
|
||||
|
||||
- die Leistungsmerkmale von Flutter auf eingebetteter Hardware detailliert untersucht
|
||||
und wertvolle Hinweise für die Auswahl des richtigen Toolkits liefert.
|
||||
- den Entwicklungsprozess detailliert beschreibt und Herausforderungen sowie
|
||||
bewährte Praktiken bei der Verwendung von Flutter in einem eingebetteten Linux-Kontext aufzeigt.
|
||||
- eine reale eingebettete GUI mit Flutter implementiert und dabei die Fähigkeiten und
|
||||
potenziellen Anwendungsfälle des Toolkits hervorhebt.
|
||||
|
||||
Die Ergebnisse dieser Arbeit sind relevant für Entwickler
|
||||
im Bereich eingebetteter Systeme, die moderne,
|
||||
performante und ansprechende GUIs für Linux-basierte Geräte entwickeln möchten.
|
||||
|
||||
## Zielsetzung
|
||||
|
||||
Ziel der Arbeit ist es, die Potenziale und Herausforderungen von
|
||||
Flutter im Bereich der GUI-Entwicklung für eingebettete Linux-Systeme
|
||||
zu beleuchten und Entwicklern wertvolle Hinweise für die Auswahl des
|
||||
richtigen Toolkits zu liefern.
|
||||
|
||||
## Problemstellung
|
||||
|
||||
Beantwortet werden soll die Frage, inwieweit sich Flutter für die Entwicklung von GUIs
|
||||
für eingebettete Linux-Systeme eignet. Dazu wird in dieser Arbeit geklärt:
|
||||
Wie einfach und effizient ist die Entwicklung und Wartung von GUIs mit Flutter?
|
||||
Welche Auswirkungen hat Flutter auf die Performance und den Ressourcenverbrauch im
|
||||
eingebetteten Kontext? Wie hoch ist der Lernaufwand für Entwickler? Welche Community
|
||||
und Support-Ressourcen stehen für Flutter-Entwickler zur Verfügung? Um diese Fragen
|
||||
zu beantworten wird die folgende Methodik angewendet.
|
||||
|
||||
## Methodik
|
||||
|
||||
Um die Forschungsfrage zu beantworten, wird eine Literaturrecherche,
|
||||
eine experimentelle Untersuchung und eine Auswertung der Untersuchung durchgeführt.
|
||||
In der Literaturrecherche werden aktuelle wissenschaftliche Quellen zu GUI-Entwicklung
|
||||
für eingebettete Systeme und Flutter ausgewertet. Die experimentelle Untersuchung
|
||||
umfasst die Implementierung einer realen eingebetteten GUI mit Flutter und die
|
||||
Bewertung der Performance, des Ressourcenverbrauchs und der Benutzerfreundlichkeit
|
||||
der GUI. Die Ergebnisse der Literaturrecherche und der experimentellen Untersuchung
|
||||
werden in einem Bewertungsschema zusammengefasst und abschließend bewertet. Basierend
|
||||
auf den Ergebnissen wird ein Leitfaden für die Entwicklung von GUIs für eingebettete
|
||||
Linux-Systeme mit Flutter erstellt.
|
||||
|
||||
## Struktur der Arbeit
|
||||
|
||||
Zu ergänzen wenn Arbeit fertig ist...
|
||||
|
||||
## Problematik
|
||||
|
||||
Zu ergänzen falls nötig...
|
||||
|
@ -0,0 +1,12 @@
|
||||
<!-- test -->
|
||||
|
||||
<!-- ## Ziel der Arbeit
|
||||
|
||||
Die Arbeit beschäftigt sich im Wesentlichen mit der Entwicklung einer
|
||||
prototypischen Anwendung mit Flutter für ein eingebettetes Linux System.
|
||||
Dabei soll ein Konzept ausgearbeitet werden, dass zeigt wie Flutter in
|
||||
eingebetteten Linux Systemen genutzt werden kann und es soll anhand der
|
||||
prototypischen Anwendung untersucht werden, wie gut Flutter für diesen
|
||||
Verwendungszweck geeignet ist. Die Ergebnisse der Untersuchung sollen
|
||||
dann genutzt werden um Empfehlungen für die Nutzung von Flutter in
|
||||
eingebetteten Linux Systemen abzuleiten. -->
|
@ -1,18 +0,0 @@
|
||||
<!--
|
||||
Challenges with Direct Statistics
|
||||
|
||||
No Centralized Reporting:
|
||||
Unlike mobile OS usage (Android vs. iOS), there's no unified app store
|
||||
or market survey specifically for embedded Linux UIs. Projects range
|
||||
from hobbyist work to closed-source industrial systems, making data
|
||||
collection highly fragmented.
|
||||
|
||||
Embedded Development Diversity:
|
||||
The range of devices running embedded Linux is immense, varying greatly
|
||||
in purpose and visibility. This creates a large sample space that’s
|
||||
hard to track systematically.
|
||||
|
||||
Subjectivity in Definition:
|
||||
What constitutes "most used" gets tricky. Is it by volume of devices
|
||||
regardless of scale, or by developer preferences in recent projects?
|
||||
-->
|
172
chapters/03_grundlagen/01_linux.md
Normal file
@ -0,0 +1,172 @@
|
||||
<!--
|
||||
Challenges with Direct Statistics
|
||||
|
||||
No Centralized Reporting:
|
||||
Unlike mobile OS usage (Android vs. iOS), there's no unified app store
|
||||
or market survey specifically for embedded Linux UIs. Projects range
|
||||
from hobbyist work to closed-source industrial systems, making data
|
||||
collection highly fragmented.
|
||||
|
||||
Embedded Development Diversity:
|
||||
The range of devices running embedded Linux is immense, varying greatly
|
||||
in purpose and visibility. This creates a large sample space that’s
|
||||
hard to track systematically.
|
||||
|
||||
Subjectivity in Definition:
|
||||
What constitutes "most used" gets tricky. Is it by volume of devices
|
||||
regardless of scale, or by developer preferences in recent projects?
|
||||
-->
|
||||
|
||||
\pagebreak
|
||||
|
||||
# Grundlagen
|
||||
|
||||
## Eingebettete Systeme
|
||||
|
||||
Traditionelle Ansichten über Computer beschreiben sie oft als
|
||||
eigenständige Geräte wie Desktops oder Laptops. Im Gegensatz dazu
|
||||
skizzierte Mark Weiser in seinem einflussreichen Paper
|
||||
"The Computer of the 21st Century" 1999 eine Vision des "Ubiquitous Computing". [@weiserComputer21stCentury1999]
|
||||
Diese Vision beschreibt eine Welt, in der nahtlos integrierte Geräte in unserem
|
||||
Leben "verschwinden". Eingebettete Systeme verkörpern heute diese Philosophie.
|
||||
Sie sind keine Allzweckcomputer, sondern spezialisierte Computer, die
|
||||
in Geräten und Systemen eingebettet sind. Sie sind in der Regel auf eine
|
||||
spezielle Aufgabe oder Funktion zugeschnitten und sind oft in
|
||||
Geräten des täglichen Lebens zu finden.
|
||||
|
||||
Beispiele für eingebettete Systeme finden sich in allen Lebensbereichen:
|
||||
|
||||
- **Automobilindustrie**: Infotainment System
|
||||
- **Industrie**: Automatisierungssysteme, Steuerung von Maschinen
|
||||
- **Medizintechnik**: Medizinische Geräte, Diagnosegeräte
|
||||
- **Haushaltsgeräte**: Waschmaschinen, Kühlschränke
|
||||
- **Consumer Electronics**: Smartphones, Smartwatches
|
||||
|
||||
Eingebettete Systeme sind oft auf Echtzeitfähigkeit, Energieeffizienz
|
||||
und Zuverlässigkeit ausgelegt. Sie sind in der Regel nicht so leistungsfähig
|
||||
wie Desktop- oder Server-Computer, aber sie sind in der Lage, spezialisierte
|
||||
Aufgaben zu erfüllen.
|
||||
|
||||
Auch Experten fällt eine klare Definition von eingebetteten Systemen
|
||||
in der heutigen Zeit nicht leicht, wie auch Jack Ganssle, ein
|
||||
Experte für eingebettete Systeme mit über 30 Jahre Berufserfahrung,
|
||||
in einem Blog Beitrag schreibt. [@ganssleWhatEmbedded2008]
|
||||
So konnte man laut Ganssle früher Systeme, die mit einem Mikrocontroller oder
|
||||
Mikroprozessor ausgestattet sind und in einem Gerät eingebettet sind,
|
||||
klar als eingebettete Systeme bezeichnen.
|
||||
Doch heutzutage werden oft auch Systeme, die mit einem vollwertigen
|
||||
Betriebssystem ausgestattet sind, als eingebettete Systeme bezeichnet.
|
||||
Dazu gehört das Linux Betriebssystem, welches in vielen eingebetteten
|
||||
Systemen zum Einsatz kommt und auch Windows ist laut Ganssle in
|
||||
eingebetteten Systemen anzutreffen. Als weiteres Beispiel dazu
|
||||
nennt er das Handy, welches als es nur zum telefonieren genutzt wurde
|
||||
klar als eingebettetes System bezeichnet werden konnte, doch heutzutage
|
||||
ist es ein vollwertiger Computer, der auch als solcher
|
||||
für eine Vielzahl von anderen Funktionen genutzt werden kann.
|
||||
|
||||
\pagebreak
|
||||
|
||||
In weiterer Literatur zu eingebetteten Systemen finden sich
|
||||
die folgenden Definitionen:
|
||||
|
||||
> "An embedded system is a microprocessor based system that is
|
||||
> built to control a function or a range of functions." [@heathEmbeddedSystemsDesign2002]
|
||||
|
||||
> "Embedded systems are information processing systems embedded into enclosing products."
|
||||
> [@marwedelEmbeddedSystemDesign2021]
|
||||
|
||||
Auch aus diesen Definitionen geht hervor, dass die Definition von eingebetteten
|
||||
Systemen nicht eindeutig ist. Da es sowohl eine Funktion oder eine Reihe von
|
||||
Funktionen steuern kann, als auch speziell ein System ist, das in ein Produkt
|
||||
eingebettet ist.
|
||||
|
||||
Ein eingebettetes System ist also meistens ein Computersystem, das spezialisiert
|
||||
ist auf eine bestimmte Funktion oder Aufgabe. Mittlerweile heißt das jedoch auch,
|
||||
dass es sich oft um Systeme handelt, welche eigentlich vollwertige Computer sind und
|
||||
daher viele Funktionen ausführen könnten, doch der Hersteller oder Entwickler das
|
||||
System auf gezielte Funktionen beschränkt. So würde ein Bankautomat mit eingebetteten Linux
|
||||
nur auf die speziellen Aufgaben beschränkt werden, welche ein Bankautomat zu erfüllen hat, obwohl er
|
||||
eigentlich ein vollwertiger Computer sein könnte und viele weitere Funktionen ausführen könnte.
|
||||
Besonders bei eingebetteten Systemen mit Touchscreens könnte eine schier unendliche Anzahl von
|
||||
Funktionen auf dem Display angezeigt und angesteuert werden. Daher kommt die Definition
|
||||
eines eingebetteten Systems auch auf die Definition des Systems vom Hersteller oder Entwickler an.
|
||||
|
||||
<!-- Ein weiterer Name für eingebettete Systeme is "Cyber-Physical Systems" (CPS).
|
||||
|
||||
Mit der zunehmenden Verbreitung von eingebetteten Systemen in einer
|
||||
Vielzahl von Geräten und der steigenden Netzwerkkonnektivität verschmelzen
|
||||
rechnerische und physikalische Prozesse immer enger miteinander. Im Jahr
|
||||
2006 prägte Helen Gill von der National Science Foundation den Begriff
|
||||
"Cyber-Physical Systems" (CPS), um diesen Paradigmenwechsel zu beschreiben. -->
|
||||
|
||||
## Linux
|
||||
|
||||
Linux ist die Bezeichnung für ein freies und quelloffenes Betriebssystem,
|
||||
das auf dem Linux-Kernel und dem GNU-Betriebssystem basiert. Hinter der
|
||||
Bezeichnung GNU steht das GNU-Projekt, das 1983 von Richard Stallman
|
||||
ins Leben gerufen wurde. Das GNU-Projekt hat das Ziel, ein vollständig
|
||||
freies Betriebssystem zu entwickeln, das auf freier Software basiert.
|
||||
Im allgemeinen Sprachgebrauch wird Linux oft als Bezeichnung für das
|
||||
gesamte Betriebssystem genutzt, obwohl es sich eigentlich um das
|
||||
Betriebssystem GNU/Linux handelt. Richard Stallman, der Gründer des
|
||||
GNU-Projekts und der Free Software Foundation, erläutert in einem
|
||||
Blog-Beitrag, dass es wichtig wäre, GNU zu erwähnen, da es viele
|
||||
der Kernkomponenten des Betriebssystems zusammen mit dem Linux-Kernel
|
||||
bildet und dass die Bezeichnung GNU/Linux diesen wichtigen Beitrag
|
||||
anerkennt. Zudem würde es dabei helfen, die Idee des GNU-Projekts
|
||||
und der Free Software Foundation zu verbreiten. [@richardstallmanWhyGNULinux]
|
||||
|
||||
In der Arbeit wird die Bezeichnung "Linux" für das Betriebssystem
|
||||
verwendet, da es sich um die allgemein gebräuchliche Bezeichnung
|
||||
handelt und die Bezeichnung "GNU/Linux" in der Literatur und im
|
||||
allgemeinen Sprachgebrauch nicht so verbreitet ist. Besonders im
|
||||
eingebetteten Bereich wird es allgemein als "Eingebettetes Linux"
|
||||
bezeichnet und nicht als "Eingebettetes GNU/Linux".
|
||||
|
||||
Linux gehört zu den weltweit am weitesten verbreiteten Betriebssystemen
|
||||
und zählt zur Gruppe von "unixoide" oder unix-ähnlichen Betriebssystemen,
|
||||
da es Konzepte des 1969 von Bell Laboratories entwickelten Betriebssystems
|
||||
Unix aufgreift.
|
||||
|
||||
Nutzer von Linux verwendet oft eine sogenannte "Distribution" von Linux
|
||||
wie Ubuntu. Eine Linux-Distribution, auch als Distro bezeichnet, ist ein vollständiges
|
||||
Betriebssystem, das auf dem Linux-Kernel aufbaut. Der Kernel ist das
|
||||
Herzstück des Betriebssystems. Zusätzlich zum Kernel gibt es weitere
|
||||
wichtige Bestandteile einer Distro, wie Systembibliotheken, Dienstprogramme
|
||||
und Softwareanwendungen. Die Auswahl dieser wird vom Ersteller der Distro
|
||||
getroffen. Distros gibt es in vielen Varianten, jede mit ihren eigenen
|
||||
Zielen, Zielgruppen und Softwareauswahl. Das bedeutet, dass es für viele
|
||||
verschiedene Anwendungsfälle eine passende Distro gibt. [@dikkyryanpratamaWhatLinuxDistribution]
|
||||
|
||||
### Eingebettetes Linux
|
||||
|
||||
Unter eingebetteten Linux versteht man die Nutzung des
|
||||
Linux-Betriebssystems im Umfeld eingebetteter Systeme. Der
|
||||
einzige wesentliche Unterschied zu dem normalen Linux-Betriebssystem
|
||||
ist dabei, dass das System auf die speziellen Anforderungen
|
||||
eingebetteter Systeme zugeschnitten ist und vor allem
|
||||
sparsamer mit den Ressourcen umgeht. Es hält jedoch nichts davon ab,
|
||||
jede Art von Linux-Distribution auf einem eingebetteten System zu
|
||||
installieren und als "eingebettetes Linux" zu betreiben. Um jedoch
|
||||
das volle Potenzial eines eingebetteten Systems auszuschöpfen, ist
|
||||
es ratsam, eine speziell für eingebettete Systeme entwickelte
|
||||
Linux-Distribution zu verwenden. Yocto ist ein Projekt mit
|
||||
dem eine solche spezielle Distribution für eingebettete Systeme
|
||||
erstellt werden kann.
|
||||
|
||||
### Das Yocto Projekt
|
||||
|
||||
Yocto ist ein Open-Source-Projekt der Linux Foundation, das es ermöglicht,
|
||||
maßgeschneiderte Linux-Distributionen für eingebettete Systeme
|
||||
zu erstellen. Es bietet hierzu eine Sammlung von Tools, Vorlagen und
|
||||
Methoden, die vor allem auf die Prinzipien der quellbasierten
|
||||
Linux-Distribution Gentoo basieren. Eine quellbasierte Distribution
|
||||
ist eine Linux-Distribution, die aus den Quellcodes der Software
|
||||
zusammengestellt wird. Das bedeutet, dass die Software auf dem
|
||||
Zielgerät aus den Quellcodes kompiliert wird und nicht aus
|
||||
vorkompilierten Binärdateien installiert wird. Dies ermöglicht
|
||||
eine hohe Flexibilität und Anpassbarkeit der Distribution und
|
||||
Software. Yocto erweitert dieses Prinzip speziell auf eingebettete
|
||||
Systeme. Es ist keine fertige Distribution, sondern ein Framework,
|
||||
mit dem eigene Distributionen speziell für eingebettete Systeme erstellt werden können.
|
||||
[@linuxfoundationYoctoProject162024]
|
127
chapters/03_grundlagen/02_flutter.md
Normal file
@ -0,0 +1,127 @@
|
||||
<!-- TODO: Was ist Flutter? -->
|
||||
|
||||
<!-- - Provide a focused overview of Flutter's architecture (widgets, rendering engine, Dart).
|
||||
- Discuss reasons why Flutter is gaining interest for non-mobile applications -->
|
||||
|
||||
## Flutter
|
||||
|
||||
Flutter ist ein von Google entwickeltes
|
||||
quelloffenes Benutzerschnittstellen-Entwicklungs-Kit,
|
||||
welches die effiziente Entwicklung ansprechender
|
||||
Benutzeroberflächen für mobile, Web- und
|
||||
Desktop-Anwendungen ermöglichen soll. Es wurde
|
||||
2017 von Google veröffentlicht und ist
|
||||
BSD-lizenziert [@3ClauseBSDLicense2011].
|
||||
|
||||
Die zunehmende Verbreitung mobiler Geräte und Betriebssysteme
|
||||
stellt die effiziente Anwendungsentwicklung vor Herausforderungen.
|
||||
Plattformübergreifende Frameworks wie Flutter zielen darauf ab,
|
||||
diese Herausforderungen zu mildern, indem sie ein einheitliches
|
||||
Toolset zum Erstellen von Benutzeroberflächen (GUIs) bereitstellen,
|
||||
die nahtlos über verschiedene Plattformen hinweg funktionieren.
|
||||
Dieses Kapitel befasst sich mit der grundlegenden Architektur
|
||||
von Flutter.
|
||||
|
||||
### Flutters Architektur
|
||||
|
||||
Flutter verwendet eine modulare, geschichtete Architektur. Dieses
|
||||
Design besteht aus unabhängigen Bibliotheken, die jeweils von der
|
||||
darunter liegenden Schicht abhängig sind, was lose Kopplung und
|
||||
Flexibilität gewährleistet. Dieser Ansatz fördert die Anpassbarkeit
|
||||
und die Möglichkeit, Framework-Komponenten nach Bedarf zu ersetzen. [@FlutterArchitecturalOverviewb]
|
||||
|
||||
Die folgende Abbildung \ref{flutterArch} zeigt die Architektur von Flutter:
|
||||
|
||||
\pagebreak
|
||||
|
||||
```{=latex}
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\caption{Flutter Architektur}
|
||||
\includegraphics[width=9cm]{assets/flutter/archdiagram.png}
|
||||
\label{flutterArch}
|
||||
|
||||
<!-- prettier-ignore -->
|
||||
\caption*{
|
||||
```
|
||||
|
||||
Quelle: @FlutterArchitecturalOverviewb
|
||||
|
||||
```{=latex}
|
||||
}
|
||||
\end{figure}
|
||||
```
|
||||
|
||||
Das Kernelement von Flutter ist die Engine, die in C/C++ geschrieben
|
||||
ist. Sie ist für das Rastern zusammengesetzter Szenen verantwortlich,
|
||||
sobald ein neues Bild gezeichnet werden muss. Sie übernimmt alle
|
||||
Aufgaben zur Darstellung der Benutzeroberfläche.
|
||||
|
||||
Auf der Engine liegt das Flutter-Framework, das in der Programmiersprache
|
||||
Dart geschrieben ist. Diese Ebene bietet ein modernes, reaktives Framework,
|
||||
das zum Aufbau der Benutzeroberfläche verwendet wird. In der Entwicklung
|
||||
von Flutter Anwendungen wird meistens nur diese Flutter-Framework Ebene
|
||||
verwendet und die komplette Flutter Anwendung wird meist nur im
|
||||
Framework Teil in Dart geschrieben.
|
||||
|
||||
Die niedrigste Ebene ist der Embedder, dessen Aufgabe es ist,
|
||||
die Rendering-Fläche bereitzustellen, die Eingaben zu verarbeiten
|
||||
und Zugriff zu Dart Anwendungs-Snapshots zu ermöglichen. [@gardeFlutterRaspberryPi2018]
|
||||
Die Flutter Engine hat hierzu eine C API, welche in einer einzelnen
|
||||
C Header-Datei definiert ist. [@theflutterauthorsEngineShellPlatform] Diese API Punkte müssen von dem
|
||||
Embedder angesprochen werden.
|
||||
|
||||
<!-- ```{#test .dart .number-lines caption="Example Dart test" captionpos=t}
|
||||
import 'package:retry/retry.dart';
|
||||
|
||||
final response = await retry(
|
||||
// Make a GET request
|
||||
() => http.get('https://google.com').timeout(Duration(seconds: 5)),
|
||||
// Retry on SocketException or TimeoutException
|
||||
retryIf: (e) => e is SocketException || e is TimeoutException,
|
||||
);
|
||||
print(response.body);
|
||||
``` -->
|
||||
|
||||
### Deklarative Programmierung in Flutter
|
||||
|
||||
Deklarative Programmierung ist ein Programmierparadigma, bei dem
|
||||
der Programmierer den gewünschten Endzustand der Anwendung
|
||||
beschreibt, anstatt die Schritte zu definieren, die zur Erreichung
|
||||
dieses Zustands erforderlich sind. Dieses Paradigma ist in Flutter
|
||||
zentral, da es die Entwicklung von Benutzeroberflächen erleichtert.
|
||||
Die Benutzeroberfläche wird als Baum von Widgets dargestellt, die
|
||||
jeweils den gewünschten Zustand der Benutzeroberfläche beschreiben.
|
||||
Wenn sich der Zustand ändert, wird der Baum der Widgets neu
|
||||
gerendert, um den neuen Zustand widerzuspiegeln. [@googleinc.IntroductionDeclarativeUI]
|
||||
|
||||
\lstinputlisting[language=Java, caption=Beispiel für deklarative Programmierung mit Flutter, linerange={65-73}, captionpos=t]
|
||||
{code/flutter_architecture/lib/main.dart}
|
||||
|
||||
Wie im Code-Beispiel zu erkennen definiert der Entwickler hier
|
||||
ein neues Widget `TextWidget`, welches einen Text als Parameter erhält
|
||||
und diesen als Text-Widget mit dem im Parameter übergebenen Text
|
||||
zurückgibt. Dieses Widget wird dann in der "build" Methode erstellt.
|
||||
An einer gegebenen Stelle im Code kann der Entwickler nun dieses
|
||||
`TextWidget` folgendermaßen verwenden:
|
||||
|
||||
```{#test .dart .number-lines caption="Nutzung des TextWidgets" captionpos=t}
|
||||
TextWidget("Hello World");
|
||||
```
|
||||
|
||||
Hier wird der Text "Hello World" als Parameter an das `TextWidget`
|
||||
übergeben und das Widget wird an der beliebigen Stelle in der Anwendung
|
||||
angezeigt wo es so eingesetzt wurde. Wenn nun aber eine dynamische
|
||||
Variable an den Text übergeben werden soll, kann dies einfach
|
||||
durch die folgende Deklaration geschehen:
|
||||
|
||||
```{.dart .number-lines caption="Nutzung des TextWidgets mit dynamischer Variable" captionpos=t}
|
||||
String text = "Hello World";
|
||||
TextWidget(text);
|
||||
```
|
||||
|
||||
Falls nun die Variable `text` sich ändert, wird das `TextWidget`
|
||||
automatisch neu gerendert und der neue Text wird angezeigt.
|
||||
Der Entwickler muss sich also nicht darum kümmern, dass das Widget
|
||||
neu gerendert wird, das ist deklarative Programmierung in Flutter.
|
||||
Das Framework übernimmt das für den Entwickler automatisch.
|
@ -1,17 +0,0 @@
|
||||
# Yocto Environment
|
||||
|
||||
## Poky
|
||||
|
||||
## Metadata
|
||||
|
||||
## Open-Embedded Project
|
||||
|
||||
## Bitbake
|
||||
|
||||
## Board support package
|
||||
|
||||
## Meta-Flutter
|
||||
|
||||
# Setting up the build environment and building the image
|
||||
|
||||
# Flashing the image on Target
|
@ -1,35 +0,0 @@
|
||||
<!-- TODO: Was ist Flutter? -->
|
||||
|
||||
# Flutter
|
||||
|
||||
Die zunehmende Verbreitung mobiler Geräte und Betriebssysteme
|
||||
stellt die effiziente Anwendungsentwicklung vor Herausforderungen.
|
||||
Plattformübergreifende Frameworks wie Flutter zielen darauf ab,
|
||||
diese Herausforderungen zu mildern, indem sie ein einheitliches
|
||||
Toolset zum Erstellen von Benutzeroberflächen (UIs) bereitstellen,
|
||||
die nahtlos über verschiedene Plattformen hinweg funktionieren.
|
||||
Dieses Kapitel befasst sich mit der grundlegenden Architektur,
|
||||
den Vorteilen und Überlegungen zur Verwendung von Flutter für
|
||||
die Anwendungsentwicklung. [@theflutterwayFlutterRubberDuck2022]
|
||||
|
||||
Was ist Flutter [@FlutterArchitecturalOverviewb]
|
||||
|
||||
test [@weiserComputer21stCentury1999]
|
||||
|
||||
```{#test .dart .number-lines caption="Example Dart test"}
|
||||
import 'package:retry/retry.dart';
|
||||
|
||||
final response = await retry(
|
||||
// Make a GET request
|
||||
() => http.get('https://google.com').timeout(Duration(seconds: 5)),
|
||||
// Retry on SocketException or TimeoutException
|
||||
retryIf: (e) => e is SocketException || e is TimeoutException,
|
||||
);
|
||||
print(response.body);
|
||||
```
|
||||
|
||||
Nice Dart highlighting!
|
||||
|
||||

|
||||
|
||||
WORKING :)
|
13
chapters/05_analyse_und_design/00_anforderungen.md
Normal file
@ -0,0 +1,13 @@
|
||||
\pagebreak
|
||||
|
||||
# Analyse und Design
|
||||
|
||||
## Anforderungen
|
||||
|
||||
### Anwendungseinsatz
|
||||
|
||||
### Anwendungsfunktionen
|
||||
|
||||
### Abgrenzungskriterien
|
||||
|
||||
### Benutzeroberfläche
|
29
chapters/05_analyse_und_design/01_architektur.md
Normal file
@ -0,0 +1,29 @@
|
||||
## Architektur
|
||||
|
||||
### Analyse
|
||||
|
||||
### Design
|
||||
|
||||
- three-layer architecture [@hajianFlutterEngineering2024, 219]
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\begin{minipage}{7cm}
|
||||
\dirtree{%
|
||||
.1 lib/.
|
||||
.2 common.
|
||||
.2 constants.
|
||||
.2 features.
|
||||
.3 benchmark.
|
||||
.3 home.
|
||||
.3 settings.
|
||||
<!-- prettier-ignore -->
|
||||
.3 system\_information.
|
||||
.2 localization.
|
||||
}
|
||||
\end{minipage}
|
||||
\caption{Example caption}
|
||||
|
||||
<!-- prettier-ignore -->
|
||||
\caption*{Quelle: hier Quellangabe}
|
||||
\end{figure}
|
BIN
chapters/06_flutter/.DS_Store
vendored
76
chapters/06_implementierung/00_entwicklungsumgebung.md
Normal file
@ -0,0 +1,76 @@
|
||||
# Implementierung
|
||||
|
||||
## Grundaufbau
|
||||
|
||||
### Entwicklungsumgebung
|
||||
|
||||
### Flutter Version Management
|
||||
|
||||
Zur Installation von Flutter und Dart empfiehlt
|
||||
sich ein Version Manager. Der bekannteste Version
|
||||
Manager ist FVM (Flutter Version Management), doch
|
||||
der neuere Manager Puro bietet viele Vorteile.
|
||||
|
||||
MacOS und Linux
|
||||
|
||||
```bash
|
||||
curl -o- https://puro.dev/install.sh | PURO_VERSION="1.4.4" bash
|
||||
```
|
||||
|
||||
Windows
|
||||
|
||||
```powershell
|
||||
Invoke-WebRequest -Uri "https://puro.dev/builds/1.4.4/windows-x64/puro.exe" -OutFile "$env:temp\puro.exe"; &"$env:temp\puro.exe" install-puro --promote
|
||||
```
|
||||
|
||||
Puro Optimierungen:
|
||||
|
||||
- parallel git clone and engine download
|
||||
- global cache for git history
|
||||
- global cache for engine versions
|
||||
|
||||
With other approaches, each Flutter repository is in its own folder, requiring you to download and store the git history, engine, and framework of each version:
|
||||
|
||||
Puro implements a technology similar to GitLab's object deduplication to avoid downloading the same git objects over and over again. It also uses symlinks to share the same engine version between multiple installations:
|
||||
|
||||
```bash
|
||||
puro use -g stable
|
||||
```
|
||||
|
||||
```bash
|
||||
puro create bachelor_elinux 3.19.0
|
||||
```
|
||||
|
||||
```bash
|
||||
puro use bachelor_elinux
|
||||
```
|
||||
|
||||
`.puro.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"env": "bachelor_elinux"
|
||||
}
|
||||
```
|
||||
|
||||
`.vscode/settings.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"dart.flutterSdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter",
|
||||
"dart.sdkPath": "/Users/fabian/.puro/envs/bachelor_elinux/flutter/bin/cache/dart-sdk"
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
puro flutter --version
|
||||
```
|
||||
|
||||
```bash
|
||||
Flutter 3.19.0 • channel stable • https://github.com/flutter/flutter.git
|
||||
Framework • revision bae5e49bc2 (6 days ago) • 2024-02-13 17:46:18 -0800
|
||||
Engine • revision 04817c99c9
|
||||
Tools • Dart 3.3.0 • DevTools 2.31.1
|
||||
```
|
||||
|
||||
## Setup von Raspberry Pi
|
@ -60,3 +60,18 @@ Caveats
|
||||
Experimental: Not considered production-ready for every use-case (as might be expected with projects pushing Flutter’s boundaries).
|
||||
Limited APIs: Compared to mainstream platforms, Flutter’s full suite of plugins and packages might not be compatible without extra platform channel work on your end.
|
||||
-->
|
||||
|
||||
<!-- Introduction:
|
||||
|
||||
- Clearly describe what your Flutter application does and its main functionality.
|
||||
|
||||
Architecture:
|
||||
|
||||
- Diagram and explain your app's structure (state management approach, key widgets, navigation).
|
||||
- Consider using visual aids to make this section more engaging.
|
||||
|
||||
Key Design Concepts:
|
||||
|
||||
- Challenges solved by your design choices.
|
||||
- Did you address performance optimizations for embedded systems?
|
||||
- How did you make the UI fit for the embedded target? -->
|
23
chapters/08_01_references/00_mermaid
Normal file
@ -0,0 +1,23 @@
|
||||
```{=latex}
|
||||
\begin{center}
|
||||
```
|
||||
|
||||
```{.mermaid loc=assets/mermaid caption="Caption" #fig:reference-name}
|
||||
graph LR
|
||||
A[Flutter] -- Engine --> B((SKIA))
|
||||
A --> C(Facebook)
|
||||
B --> D{Twitter}
|
||||
C --> D
|
||||
```
|
||||
|
||||
```{=latex}
|
||||
\end{center}
|
||||
```
|
||||
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\caption{Example caption}
|
||||
|
||||
<!-- prettier-ignore -->
|
||||
\caption*{Quelle: hier Quellangabe}
|
||||
\end{figure}
|
2
chapters/08_01_references/01_code
Normal file
@ -0,0 +1,2 @@
|
||||
\lstinputlisting[language=Java, caption=Beispiel öpvn, linerange={65-73}]
|
||||
{code/flutter_architecture/lib/main.dart}
|
8
chapters/08_01_references/02_image
Normal file
@ -0,0 +1,8 @@
|
||||
\begin{figure}[ht]
|
||||
\centering
|
||||
\includegraphics[scale=1]{assets/flutter/archdiagram.png}
|
||||
\caption{Example caption}
|
||||
|
||||
<!-- prettier-ignore -->
|
||||
\caption*{Quelle: hier Quellangabe}
|
||||
\end{figure}
|
@ -1,3 +1,5 @@
|
||||
\pagebreak
|
||||
|
||||
# Literaturverzeichnis
|
||||
|
||||
\setstretch{1.0}
|
||||
|
43
code/flutter_architecture/.gitignore
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
# Miscellaneous
|
||||
*.class
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
.DS_Store
|
||||
.atom/
|
||||
.buildlog/
|
||||
.history
|
||||
.svn/
|
||||
migrate_working_dir/
|
||||
|
||||
# IntelliJ related
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.idea/
|
||||
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
**/ios/Flutter/.last_build_id
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
.pub-cache/
|
||||
.pub/
|
||||
/build/
|
||||
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
42
code/flutter_architecture/.metadata
Normal file
@ -0,0 +1,42 @@
|
||||
# This file tracks properties of this Flutter project.
|
||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||
#
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: "41456452f29d64e8deb623a3c927524bcf9f111b"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
||||
# Tracks metadata for the flutter migrate command
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
- platform: android
|
||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
- platform: ios
|
||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
- platform: linux
|
||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
- platform: macos
|
||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
- platform: web
|
||||
create_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
base_revision: 41456452f29d64e8deb623a3c927524bcf9f111b
|
||||
|
||||
# User provided section
|
||||
|
||||
# List of Local paths (relative to this file) that should be
|
||||
# ignored by the migrate tool.
|
||||
#
|
||||
# Files that are not part of the templates will be ignored by default.
|
||||
unmanaged_files:
|
||||
- 'lib/main.dart'
|
||||
- 'ios/Runner.xcodeproj/project.pbxproj'
|
16
code/flutter_architecture/README.md
Normal file
@ -0,0 +1,16 @@
|
||||
# flutter_architecture
|
||||
|
||||
A new Flutter project.
|
||||
|
||||
## Getting Started
|
||||
|
||||
This project is a starting point for a Flutter application.
|
||||
|
||||
A few resources to get you started if this is your first Flutter project:
|
||||
|
||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
||||
|
||||
For help getting started with Flutter development, view the
|
||||
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
||||
samples, guidance on mobile development, and a full API reference.
|
28
code/flutter_architecture/analysis_options.yaml
Normal file
@ -0,0 +1,28 @@
|
||||
# This file configures the analyzer, which statically analyzes Dart code to
|
||||
# check for errors, warnings, and lints.
|
||||
#
|
||||
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||
# invoked from the command line by running `flutter analyze`.
|
||||
|
||||
# The following line activates a set of recommended lints for Flutter apps,
|
||||
# packages, and plugins designed to encourage good coding practices.
|
||||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
linter:
|
||||
# The lint rules applied to this project can be customized in the
|
||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||
# included above or to enable additional rules. A list of all available lints
|
||||
# and their documentation is published at https://dart.dev/lints.
|
||||
#
|
||||
# Instead of disabling a lint rule for the entire project in the
|
||||
# section below, it can also be suppressed for a single line of code
|
||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||
# producing the lint.
|
||||
rules:
|
||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||
|
||||
# Additional information about this file can be found at
|
||||
# https://dart.dev/guides/language/analysis-options
|
13
code/flutter_architecture/android/.gitignore
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
gradle-wrapper.jar
|
||||
/.gradle
|
||||
/captures/
|
||||
/gradlew
|
||||
/gradlew.bat
|
||||
/local.properties
|
||||
GeneratedPluginRegistrant.java
|
||||
|
||||
# Remember to never publicly share your keystore.
|
||||
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||
key.properties
|
||||
**/*.keystore
|
||||
**/*.jks
|
67
code/flutter_architecture/android/app/build.gradle
Normal file
@ -0,0 +1,67 @@
|
||||
plugins {
|
||||
id "com.android.application"
|
||||
id "kotlin-android"
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
}
|
||||
|
||||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||
localProperties.load(reader)
|
||||
}
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = '1'
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = '1.0'
|
||||
}
|
||||
|
||||
android {
|
||||
namespace "com.example.flutter_architecture"
|
||||
compileSdkVersion flutter.compileSdkVersion
|
||||
ndkVersion flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.flutter_architecture"
|
||||
// You can update the following values to match your application needs.
|
||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdkVersion flutter.minSdkVersion
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
// TODO: Add your own signing config for the release build.
|
||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||
signingConfig signingConfigs.debug
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {}
|
@ -0,0 +1,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
@ -0,0 +1,33 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<application
|
||||
android:label="flutter_architecture"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
to determine the Window background behind the Flutter UI. -->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme"
|
||||
/>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
<meta-data
|
||||
android:name="flutterEmbedding"
|
||||
android:value="2" />
|
||||
</application>
|
||||
</manifest>
|
@ -0,0 +1,6 @@
|
||||
package com.example.flutter_architecture
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
class MainActivity: FlutterActivity() {
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="?android:colorBackground" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Modify this file to customize your launch splash screen -->
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@android:color/white" />
|
||||
|
||||
<!-- You can insert your own image assets here -->
|
||||
<!-- <item>
|
||||
<bitmap
|
||||
android:gravity="center"
|
||||
android:src="@mipmap/launch_image" />
|
||||
</item> -->
|
||||
</layer-list>
|
After Width: | Height: | Size: 544 B |
After Width: | Height: | Size: 442 B |
After Width: | Height: | Size: 721 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
the Flutter engine draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
@ -0,0 +1,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
the Flutter tool needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
30
code/flutter_architecture/android/build.gradle
Normal file
@ -0,0 +1,30 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.7.10'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
3
code/flutter_architecture/android/gradle.properties
Normal file
@ -0,0 +1,3 @@
|
||||
org.gradle.jvmargs=-Xmx4G
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
5
code/flutter_architecture/android/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
|
29
code/flutter_architecture/android/settings.gradle
Normal file
@ -0,0 +1,29 @@
|
||||
pluginManagement {
|
||||
def flutterSdkPath = {
|
||||
def properties = new Properties()
|
||||
file("local.properties").withInputStream { properties.load(it) }
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
return flutterSdkPath
|
||||
}
|
||||
settings.ext.flutterSdkPath = flutterSdkPath()
|
||||
|
||||
includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
|
||||
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||
id "com.android.application" version "7.3.0" apply false
|
||||
}
|
||||
|
||||
include ":app"
|
34
code/flutter_architecture/ios/.gitignore
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
**/dgph
|
||||
*.mode1v3
|
||||
*.mode2v3
|
||||
*.moved-aside
|
||||
*.pbxuser
|
||||
*.perspectivev3
|
||||
**/*sync/
|
||||
.sconsign.dblite
|
||||
.tags*
|
||||
**/.vagrant/
|
||||
**/DerivedData/
|
||||
Icon?
|
||||
**/Pods/
|
||||
**/.symlinks/
|
||||
profile
|
||||
xcuserdata
|
||||
**/.generated/
|
||||
Flutter/App.framework
|
||||
Flutter/Flutter.framework
|
||||
Flutter/Flutter.podspec
|
||||
Flutter/Generated.xcconfig
|
||||
Flutter/ephemeral/
|
||||
Flutter/app.flx
|
||||
Flutter/app.zip
|
||||
Flutter/flutter_assets/
|
||||
Flutter/flutter_export_environment.sh
|
||||
ServiceDefinitions.json
|
||||
Runner/GeneratedPluginRegistrant.*
|
||||
|
||||
# Exceptions to above rules.
|
||||
!default.mode1v3
|
||||
!default.mode2v3
|
||||
!default.pbxuser
|
||||
!default.perspectivev3
|
26
code/flutter_architecture/ios/Flutter/AppFrameworkInfo.plist
Normal file
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>App</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>io.flutter.flutter.app</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>App</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>12.0</string>
|
||||
</dict>
|
||||
</plist>
|
1
code/flutter_architecture/ios/Flutter/Debug.xcconfig
Normal file
@ -0,0 +1 @@
|
||||
#include "Generated.xcconfig"
|
1
code/flutter_architecture/ios/Flutter/Release.xcconfig
Normal file
@ -0,0 +1 @@
|
||||
#include "Generated.xcconfig"
|
617
code/flutter_architecture/ios/Runner.xcodeproj/project.pbxproj
Normal file
@ -0,0 +1,617 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
|
||||
remoteInfo = Runner;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
||||
);
|
||||
name = Flutter;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
331C8082294A63A400263BE5 /* RunnerTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
331C807B294A618700263BE5 /* RunnerTests.swift */,
|
||||
);
|
||||
path = RunnerTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146E51CF9000F007C117D = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9740EEB11CF90186004384FC /* Flutter */,
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146EF1CF9000F007C117D /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
97C146EE1CF9000F007C117D /* Runner.app */,
|
||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146F01CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
|
||||
97C147021CF9000F007C117D /* Info.plist */,
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
|
||||
);
|
||||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
331C8080294A63A400263BE5 /* RunnerTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||
buildPhases = (
|
||||
331C807D294A63A400263BE5 /* Sources */,
|
||||
331C807E294A63A400263BE5 /* Frameworks */,
|
||||
331C807F294A63A400263BE5 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
331C8086294A63A400263BE5 /* PBXTargetDependency */,
|
||||
);
|
||||
name = RunnerTests;
|
||||
productName = RunnerTests;
|
||||
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
97C146ED1CF9000F007C117D /* Runner */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = Runner;
|
||||
productName = Runner;
|
||||
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
97C146E61CF9000F007C117D /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = YES;
|
||||
LastUpgradeCheck = 1430;
|
||||
ORGANIZATIONNAME = "";
|
||||
TargetAttributes = {
|
||||
331C8080294A63A400263BE5 = {
|
||||
CreatedOnToolsVersion = 14.0;
|
||||
TestTargetID = 97C146ED1CF9000F007C117D;
|
||||
};
|
||||
97C146ED1CF9000F007C117D = {
|
||||
CreatedOnToolsVersion = 7.3.1;
|
||||
LastSwiftMigration = 1100;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 97C146E51CF9000F007C117D;
|
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
97C146ED1CF9000F007C117D /* Runner */,
|
||||
331C8080294A63A400263BE5 /* RunnerTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
331C807F294A63A400263BE5 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
97C146EC1CF9000F007C117D /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
|
||||
);
|
||||
name = "Thin Binary";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Run Script";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
331C807D294A63A400263BE5 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
97C146EA1CF9000F007C117D /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 97C146ED1CF9000F007C117D /* Runner */;
|
||||
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C146FB1CF9000F007C117D /* Base */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
97C147001CF9000F007C117D /* Base */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
249021D3217E4FDB00AE95B9 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
249021D4217E4FDB00AE95B9 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = T67F6A44RM;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
331C8088294A63A400263BE5 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
331C8089294A63A400263BE5 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
331C808A294A63A400263BE5 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture.RunnerTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||
};
|
||||
name = Profile;
|
||||
};
|
||||
97C147031CF9000F007C117D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
97C147041CF9000F007C117D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
97C147061CF9000F007C117D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = T67F6A44RM;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
97C147071CF9000F007C117D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = T67F6A44RM;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterArchitecture;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
331C8088294A63A400263BE5 /* Debug */,
|
||||
331C8089294A63A400263BE5 /* Release */,
|
||||
331C808A294A63A400263BE5 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
97C147031CF9000F007C117D /* Debug */,
|
||||
97C147041CF9000F007C117D /* Release */,
|
||||
249021D3217E4FDB00AE95B9 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
97C147061CF9000F007C117D /* Debug */,
|
||||
97C147071CF9000F007C117D /* Release */,
|
||||
249021D4217E4FDB00AE95B9 /* Profile */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||
}
|
7
code/flutter_architecture/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1430"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO"
|
||||
parallelizable = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "331C8080294A63A400263BE5"
|
||||
BuildableName = "RunnerTests.xctest"
|
||||
BlueprintName = "RunnerTests"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Profile"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||
BuildableName = "Runner.app"
|
||||
BlueprintName = "Runner"
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
7
code/flutter_architecture/ios/Runner.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "group:Runner.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
13
code/flutter_architecture/ios/Runner/AppDelegate.swift
Normal file
@ -0,0 +1,13 @@
|
||||
import UIKit
|
||||
import Flutter
|
||||
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||
) -> Bool {
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
}
|
@ -0,0 +1,122 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-20x20@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-29x29@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-40x40@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-60x60@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "60x60",
|
||||
"idiom" : "iphone",
|
||||
"filename" : "Icon-App-60x60@3x.png",
|
||||
"scale" : "3x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-20x20@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "20x20",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-20x20@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-29x29@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "29x29",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-29x29@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-40x40@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "40x40",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-40x40@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-76x76@1x.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "76x76",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-76x76@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "83.5x83.5",
|
||||
"idiom" : "ipad",
|
||||
"filename" : "Icon-App-83.5x83.5@2x.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "1024x1024",
|
||||
"idiom" : "ios-marketing",
|
||||
"filename" : "Icon-App-1024x1024@1x.png",
|
||||
"scale" : "1x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 295 B |
After Width: | Height: | Size: 406 B |
After Width: | Height: | Size: 450 B |
After Width: | Height: | Size: 282 B |
After Width: | Height: | Size: 462 B |
After Width: | Height: | Size: 704 B |
After Width: | Height: | Size: 406 B |
After Width: | Height: | Size: 586 B |