Після Hello World на Flutter напишіть програму з двома екранами:
- SplashScreen - Екран введення програми
- HomeScreen - програма на головному екрані
Цікаво, що у Flutter є система навігації по вікнах (сторінках) програми. Це чимось схоже на систему роутів в Django (https://evileg.com/ru/knowledge/django/), щоб визначити, який View викликати.
Насправді, у цьому додатку нам потрібно буде викликати віджет MaterialApp, який приймає систему маршрутів routes , яка визначатиме які вікна відкривати. Першим вікном буде SplashScreen , через дві секунди має відкритися HomeScreen .
Структура проекту
Я показую лише необхідну частину структури проекту:
- main.dart - файл з основною функцією та запуском MaterialApp
- splash_screen.dart - початкове вікно програми
- home_screen.dart - Вікно домашньої програми
main.dart
- import 'package:flutter/material.dart';
- import 'package:evileg/screens/Splash/splash_screen.dart';
- import 'package:evileg/screens/Home/home_screen.dart';
- // Application launch
- void main() => runApp(MyApp());
- // The main application widget
- class MyApp extends StatelessWidget {
- // We form application routing
- final routes = <String, WidgetBuilder>{
- // The path that creates the Home Screen
- '/Home': (BuildContext context) => HomeScreen(title: 'EVILEG')
- };
- // Redefine widget instance construction method
- @override
- Widget build(BuildContext context) {
- // This will be an application with the support of Material Design.
- return MaterialApp(
- title: 'EVILEG',
- // in which there will be a Splash Screen indicating the next route
- home: SplashScreen(nextRoute: '/Home'),
- // passing routes to the application
- routes: routes,
- );
- }
- }
splash_screen.dart
- import 'dart:core';
- import 'dart:async';
- import 'package:flutter/material.dart';
- // Inheriting from the state widget
- // that is, a widget for changing the state of which is not required to recreate its instance
- class SplashScreen extends StatefulWidget {
- // variable to store the route
- final String nextRoute;
- // the constructor, the constructor body is moved to the argument area,
- // that is, immediately the arguments are passed to the body of the constructor and set by internal variables
- // Dart allows it
- SplashScreen({this.nextRoute});
- // all same widgets should create their own state,
- // need to override this method
- @override
- State<StatefulWidget> createState() => _SplashScreenState();
- }
- // Create a widget state
- class _SplashScreenState extends State<SplashScreen> {
- // State initialization
- @override
- void initState() {
- super.initState();
- // Create a timer to switch SplashScreen to HomeScreen after 2 seconds.
- Timer(
- Duration(seconds: 2),
- // To do this, use the static method of the navigator.
- // This is very similar to passing the lambda function to the std::function argument in C++.
- () { Navigator.of(context).pushReplacementNamed(widget.nextRoute); }
- );
- }
- // Widget creation
- @override
- Widget build(BuildContext context) {
- // And this is the layout of the widget,
- // a bit like QML although obviously not a JSON structure
- return Scaffold(
- backgroundColor: Colors.blue,
- body: Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- Text('EVILEG'),
- Text("Welcome to social network of programmers")
- ],
- ),
- ),
- );
- }
- }
home_screen.dart
- import 'dart:core';
- import 'package:flutter/material.dart';
- // The same widget as SplashScreen, just give it another title
- class HomeScreen extends StatefulWidget {
- HomeScreen({Key key, this.title}) : super(key: key);
- final String title;
- @override
- _HomeScreenState createState() => _HomeScreenState();
- }
- // Creation a widget state
- class _HomeScreenState extends State<HomeScreen> {
- // Unlike SplashScreen add AppBar
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- title: Text(widget.title),
- ),
- body: Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- Text('Home page',),
- ],
- ),
- ),
- );
- }
- }
Висновок
В результаті отримуємо наступні два вікна програми.
Заставка
існує 2 секунди
Домашній екран
Перемикається на нього після SplashScreen
Java проти Dart
Звичайно, я вже давно не займаюся розробкою під Android, а тим більше на Java. Напевно все сильно змінилося і можливо, що на краще, але наскільки я пам'ятаю, в Java менше уваги приділялося створенню стану, що іноді викликало деякі проблеми. Тому що цей стан потрібно створювати, зберігати і т.д. Іноді програма падала навіть при повороті екрана. Це приносило дуже великі проблеми та незручності.
У Dart віджети створюються з передачею контексту під час маршрутизації між вікнами. Тобто, як я розумію, стан програми вже не поділено на різні активації, а є більш монолітним. Це може вирішити деякі проблеми, які були в Java, але, безумовно, може викликати інші проблеми, яких не було. Дізнайтеся про це у наступних статтях. Найцікавіше, чим це скінчиться. У результаті зараз планую спробувати написати мобільний додаток для сайту на Flutter/Dart.
Не работает, вставил код, поменял пути, но выдает ошибки