SplashScreen บน Flutter ทำยังไงไปดูกัน


เข้าใจเงื่อนไขของ SplashScreen ก่อน การทำหน้านี้นั้นอารมณ์เหมือนหน้าแนะนำแอพก่อนเข้าระบบ ซึ่งแต่ละแอพก็จะมีวิธีการใช้งานต่างกัน แต่ตัวอย่างนี้จะเป็นการรอ 4 วินาที แล้วให้รันไปหน้าถัดไปนะครับ

อธิบายโค้ด

final interval = const Duration(seconds: 1);
final int timerMaxSeconds = 4;
int currentSeconds = 0;
กำหนดระยะเวลารันเป็น 1 วินาที
กำหนดระยะเวลาสิ้นสุดเป็น 4 วินาที
กำหนดระยะเวลาเริ่มต้นที่ 0 วินาที

@override
  void initState() {
    startTimeout();
    super.initState();
}
เมื่อเปิดมาแอพจะรันที่ Method initState() ก่อน โดยจะเข้า startTimeout() เพื่อเริ่มนับเวลา

startTimeout([int milliseconds]) {
    var duration = interval;
    Timer.periodic(duration, (timer) {
      setState(() {
        currentSeconds = timer.tick;
        if (timer.tick >= timerMaxSeconds) {
          timer.cancel();
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => LoginPage()),
          );
        }
      });
    });
  }
เมื่อเข้า startTimeout ก็จะเริ่มทำการนับเวลาไปตามเงื่อนไขของโค้ด และเมื่อครบ 4 วินาที ตัวแอพก็จะรันไปยังหน้าถัดไปทันทีจากโค้ด Navigator.pushReplacement เพื่อไปยังหน้า Method LoginPage() ไปยังหน้า login.dart ต่อไป

โค้ดในโฟลเดอร์ lib ทั้งหมด

ไฟล์ main.dart
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import 'package:flutter/material.dart';
import 'package:hello/splash_screen.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Firebase Authentication Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SplashScreen(),
    );
  }
}
หน้าแรกสำหรับแอพพลิเคชั่น เมื่อแอพเปิดมาจะรันไปยังหน้า splash_screen.dart ทันที ผลจากบรรทัดที่ 16 

ไฟล์ splash_screen.dart
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import 'package:flutter/material.dart';
import 'dart:ui';
import 'dart:async';

import 'package:hello/login_page.dart';

class SplashScreen extends StatefulWidget {
  @override
  _TimerButton createState() => _TimerButton();
}

class _TimerButton extends State<SplashScreen> {
  final interval = const Duration(seconds: 1);
  final int timerMaxSeconds = 4;
  int currentSeconds = 0;

  startTimeout([int milliseconds]) {
    var duration = interval;
    Timer.periodic(duration, (timer) {
      setState(() {
        currentSeconds = timer.tick;
        if (timer.tick >= timerMaxSeconds) {
          timer.cancel();
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => LoginPage()),
          );
        }
      });
    });
  }

  @override
  void initState() {
    startTimeout();
    super.initState();
  }

  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              Image.asset(
                'assets/images/logo.png',
                width: 200.0,
                height: 200.0,
              ),
            ],
          ),
        ),
      ),
    );
  }
}
เมื่อรอ 4 วินาทีจากหน้า splashscreen.dart เสร็จแล้วจะรันไปหน้า login_page.dart ต่อ

ไฟล์ login_page.dart
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import 'package:flutter/material.dart';

class LoginPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _State();
}

class _State extends State<LoginPage> {
  TextEditingController nameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Login Screen App'),
        ),
        body: Padding(
            padding: EdgeInsets.all(10),
            child: ListView(
              children: <Widget>[
                Container(
                  alignment: Alignment.center,
                  padding: EdgeInsets.all(10),
                ),
                Container(
                  padding: EdgeInsets.all(10),
                  child: TextField(
                    controller: nameController,
                    decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: 'User Name',
                    ),
                  ),
                ),
                Container(
                  padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
                  child: TextField(
                    obscureText: true,
                    controller: passwordController,
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Password',
                        counterText: '000000'),
                  ),
                ),
                FlatButton(
                  onPressed: () {
                    //forgot password screen
                  },
                  textColor: Colors.blue,
                  child: Text('Forgot Password'),
                ),
                Container(
                    height: 50,
                    padding: EdgeInsets.fromLTRB(10, 0, 10, 0),
                    child: RaisedButton(
                      textColor: Colors.white,
                      color: Colors.blue,
                      child: Text('Login'),
                      onPressed: () {
                        LoginMethod(context);
                      },
                    )),
                Container(
                    child: Row(
                  children: <Widget>[
                    Text('Does not have account?'),
                    FlatButton(
                      textColor: Colors.blue,
                      child: Text(
                        'Sign in',
                        style: TextStyle(fontSize: 20),
                      ),
                      onPressed: () {
                        /* Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) => RegisterApp()),
                        ); */
                      },
                    )
                  ],
                  mainAxisAlignment: MainAxisAlignment.center,
                ))
              ],
            )));
  }

  void LoginMethod(BuildContext context) {
    String Email = nameController.text.trim();
    String Password = passwordController.text.trim();
  
  }
}
สำหรับใครที่ต้องการให้รันไปหน้าไหน ให้ใส่โค้ด Navigator.push ในบรรทัดที่ 77-80 ได้เลย เมื่อกดปุ่มก็จะรันไปยังหน้านั้นๆ

ส่วน LoginMethod ก็เป็นการรับค่า Email , Password มาจาก TextField มาเพื่อนำไปใช้ login ต่อไป

Source Code : https://github.com/tanat29/SplashScreen-Flutter

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การรับค่า ส่งค่าจากหน้าที่ 1 ไปหน้าที่ 2 บน Flutter (How to pass data between screens in Flutter?)

การจับเวลาบน Flutter ทำยังไง (How to count up timer flutter?)

วิธีการสลับข้อมูล MySQL ในคอลัมน์เดียวกัน