Evgenii Legotckoi
07 січня 2019 р. 14:04

Flutter - Підручник 002. Створення заставки з переміщенням на головний екран

Після Hello World на Flutter напишіть програму з двома екранами:

  • SplashScreen - Екран введення програми
  • HomeScreen - програма на головному екрані

Цікаво, що у Flutter є система навігації по вікнах (сторінках) програми. Це чимось схоже на систему роутів в Django (https://evileg.com/ru/knowledge/django/), щоб визначити, який View викликати.

Насправді, у цьому додатку нам потрібно буде викликати віджет MaterialApp, який приймає систему маршрутів routes , яка визначатиме які вікна відкривати. Першим вікном буде SplashScreen , через дві секунди має відкритися HomeScreen .


Структура проекту

Структура проекту SplashScreen

Я показую лише необхідну частину структури проекту:

  • main.dart - файл з основною функцією та запуском MaterialApp
  • splash_screen.dart - початкове вікно програми
  • home_screen.dart - Вікно домашньої програми

main.dart

  1. import 'package:flutter/material.dart';
  2. import 'package:evileg/screens/Splash/splash_screen.dart';
  3. import 'package:evileg/screens/Home/home_screen.dart';
  4.  
  5. // Application launch
  6. void main() => runApp(MyApp());
  7.  
  8. // The main application widget
  9. class MyApp extends StatelessWidget {
  10.  
  11. // We form application routing
  12. final routes = <String, WidgetBuilder>{
  13. // The path that creates the Home Screen
  14. '/Home': (BuildContext context) => HomeScreen(title: 'EVILEG')
  15. };
  16.  
  17. // Redefine widget instance construction method
  18. @override
  19. Widget build(BuildContext context) {
  20. // This will be an application with the support of Material Design.
  21. return MaterialApp(
  22. title: 'EVILEG',
  23. // in which there will be a Splash Screen indicating the next route
  24. home: SplashScreen(nextRoute: '/Home'),
  25. // passing routes to the application
  26. routes: routes,
  27. );
  28. }
  29. }
  30.  

splash_screen.dart

  1. import 'dart:core';
  2. import 'dart:async';
  3. import 'package:flutter/material.dart';
  4.  
  5. // Inheriting from the state widget
  6. // that is, a widget for changing the state of which is not required to recreate its instance
  7. class SplashScreen extends StatefulWidget {
  8. // variable to store the route
  9. final String nextRoute;
  10.  
  11. // the constructor, the constructor body is moved to the argument area,
  12. // that is, immediately the arguments are passed to the body of the constructor and set by internal variables
  13. // Dart allows it
  14. SplashScreen({this.nextRoute});
  15.  
  16. // all same widgets should create their own state,
  17. // need to override this method
  18. @override
  19. State<StatefulWidget> createState() => _SplashScreenState();
  20. }
  21.  
  22. // Create a widget state
  23. class _SplashScreenState extends State<SplashScreen> {
  24.  
  25. // State initialization
  26. @override
  27. void initState() {
  28. super.initState();
  29. // Create a timer to switch SplashScreen to HomeScreen after 2 seconds.
  30. Timer(
  31. Duration(seconds: 2),
  32. // To do this, use the static method of the navigator.
  33. // This is very similar to passing the lambda function to the std::function argument in C++.
  34. () { Navigator.of(context).pushReplacementNamed(widget.nextRoute); }
  35. );
  36. }
  37.  
  38. // Widget creation
  39. @override
  40. Widget build(BuildContext context) {
  41. // And this is the layout of the widget,
  42. // a bit like QML although obviously not a JSON structure
  43. return Scaffold(
  44. backgroundColor: Colors.blue,
  45. body: Center(
  46. child: Column(
  47. mainAxisAlignment: MainAxisAlignment.center,
  48. children: <Widget>[
  49. Text('EVILEG'),
  50. Text("Welcome to social network of programmers")
  51. ],
  52. ),
  53. ),
  54. );
  55. }
  56.  
  57. }

home_screen.dart

  1. import 'dart:core';
  2. import 'package:flutter/material.dart';
  3.  
  4. // The same widget as SplashScreen, just give it another title
  5. class HomeScreen extends StatefulWidget {
  6. HomeScreen({Key key, this.title}) : super(key: key);
  7. final String title;
  8.  
  9. @override
  10. _HomeScreenState createState() => _HomeScreenState();
  11. }
  12.  
  13. // Creation a widget state
  14. class _HomeScreenState extends State<HomeScreen> {
  15.  
  16. // Unlike SplashScreen add AppBar
  17. @override
  18. Widget build(BuildContext context) {
  19. return Scaffold(
  20. appBar: AppBar(
  21. title: Text(widget.title),
  22. ),
  23. body: Center(
  24. child: Column(
  25. mainAxisAlignment: MainAxisAlignment.center,
  26. children: <Widget>[
  27. Text('Home page',),
  28. ],
  29. ),
  30. ),
  31. );
  32. }
  33. }

Висновок

В результаті отримуємо наступні два вікна програми.

Заставка

існує 2 секунди

SplashScreen

Домашній екран

Перемикається на нього після SplashScreen

HomeScreen

Java проти Dart

Звичайно, я вже давно не займаюся розробкою під Android, а тим більше на Java. Напевно все сильно змінилося і можливо, що на краще, але наскільки я пам'ятаю, в Java менше уваги приділялося створенню стану, що іноді викликало деякі проблеми. Тому що цей стан потрібно створювати, зберігати і т.д. Іноді програма падала навіть при повороті екрана. Це приносило дуже великі проблеми та незручності.

У Dart віджети створюються з передачею контексту під час маршрутизації між вікнами. Тобто, як я розумію, стан програми вже не поділено на різні активації, а є більш монолітним. Це може вирішити деякі проблеми, які були в Java, але, безумовно, може викликати інші проблеми, яких не було. Дізнайтеся про це у наступних статтях. Найцікавіше, чим це скінчиться. У результаті зараз планую спробувати написати мобільний додаток для сайту на Flutter/Dart.

Рекомендовані статті на цю тему

По статті запитували1питання

3

Вам це подобається? Поділіться в соціальних мережах!

МШ
  • 22 жовтня 2022 р. 15:18

Не работает, вставил код, поменял пути, но выдает ошибки

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…