manofi21
3/21/2020 - 10:55 PM

dalam aplikasi, jika pertama kali baru di install, user akan dilihatkan screen penjelasan singkat tentang aplikasi tersebut. Tapi hanya seka

dalam aplikasi, jika pertama kali baru di install, user akan dilihatkan screen penjelasan singkat tentang aplikasi tersebut. Tapi hanya sekali. Di kedua kali dan seterusnya screen itu tidak akan pernah muncul lagi. Tentu setiap perusahaan, designya berbeda - beda. Tapi yang mendasar, dibuat dengan Corauser.

// membuat 1 screen ber-parameter sesuai dengan data statik di onboarding
pubspec.yaml
  - easy_rich_text: ^0.2.2

class HomeBoard extends StatelessWidget {
  Slide slides;
  String stButton;
  Function stFunction;
  String ndButton;
  Function ndFunction;
  HomeBoard(this.slides, this.stButton, this.stFunction, this.ndButton,
      this.ndFunction);
  static const Color red = Color(0xFFEE0B3B);
  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        Container(
            width: MediaQuery.of(context).size.width,
            color: red,
            child: Column(mainAxisAlignment: MainAxisAlignment.end, children: <
                Widget>[
              SizedBox(
                child: Container(
                  decoration: BoxDecoration(
                      color: Colors.white,
                      borderRadius: BorderRadius.all(Radius.circular(50.0))),
                  child: Column(children: [
                    ClipPath(
                      child: Image.asset(
                        slides.imageUrl,
                        color: Colors.red,
                        colorBlendMode: BlendMode.modulate,
                      ),
                    ),
                    SizedBox(height: MediaQuery.of(context).size.height / 40),
                    Container(
                      child: Text(slides.title),
                    ),
                    SizedBox(height: 45),
                    Center(
                      child: Container(
                          padding: EdgeInsets.symmetric(horizontal: 23),
                          child: EasyRichText(
                            slides.description,
                            patternList: [],
                            textAlign: TextAlign.center,
                          )),
                    ),
                    SizedBox(
                        height: (MediaQuery.of(context).size.height / 4) - 8),
                    Container(
                        width: MediaQuery.of(context).size.width,
                        child: FlatButton(
                            onPressed: stFunction,
                            child: Text(
                              stButton,
                              style: TextStyle(
                                  color: red,
                                  fontSize:
                                      MediaQuery.of(context).size.width / 20),
                            )))
                  ]),
                ),
              ),
              Container(
                  width: MediaQuery.of(context).size.width,
                  child: FlatButton(
                    onPressed: ndFunction,
                    child: Text(ndButton,
                        style: TextStyle(
                            color: Colors.white,
                            fontSize: MediaQuery.of(context).size.width / 20)),
                  )),
            ]))
      ],
    );
  }
}
import 'package:flutter/material.dart';
// untuk menyimpan 3 data statik di onboarding
class Slide {
  final String imageUrl;
  final String title;
  final String description;


  Slide({
    @required this.imageUrl,
    @required this.title,
    @required this.description,

  });
}

final slideList = [
  Slide(
    imageUrl: 'assets/images/onboarding-1.png',
    title: 'SMART LOCKER',
    description: ' We provides smar lockers located across over hundreds of office and strategic locations around Jakarta for your conivinience ',
  ),
  Slide(
    imageUrl: 'assets/images/onboarding-2.png',
    title: 'PROFESSIONAL SHOES TECH',
    description: 'All our sevices and treatments are done by a team of experienced and certified proffesionals \n',
  ),
  Slide(
    imageUrl: 'assets/images/onboarding-3.png',
    title: 'COMPETITIVE PRICE',
    description: 'Premium at an affordable price, complete your transaction with a variety of payment portal options. Pay with a payment portal of your choices',
  ),
];
// screen yang akan menampilkan semua data stati untuk boarding itu sendiri
pubspec.yaml
  # salah satu package yang digunakan untuk membuat corauser 
  - smooth_page_indicator: ^0.1.4
  
class Boarding extends StatefulWidget {
  @override
  _BoardingState createState() => _BoardingState();
}

class _BoardingState extends State<Boarding> {
  // Page controller di gunakan untuk di pasang di PageView.builder dan SmoothPageIndicator untuk singkrinisasi 2 widget
  static final _controller = new PageController();
  
  // dengan controller, kedua widget tersebut akan terhubung dan dapat diatur.
  // .animateToPage = untuk melompat dari 1 halaman ke halaman lain sesuai index  
  static void skip() {
    _controller.animateToPage(2,
        duration: Duration(seconds: 2), curve: Curves.fastOutSlowIn);
  }

  static void nextOrBack(int i) {
    _controller.animateToPage(i,
        duration: Duration(seconds: 1), curve: Curves.fastOutSlowIn);
  }

  static void replacement(BuildContext context, String routers) {
    Navigator.pushReplacementNamed(context, routers);
  }
  static const Color red = Color(0xFFEE0B3B);
  @override
  Widget build(BuildContext context) {
    final List<Widget> _widgest = [
      HomeBoard(slideList[0], "Next", () => nextOrBack(1), "Skip", () => skip()),
      HomeBoard(slideList[1], "Next", () => nextOrBack(2), "Back",
          () => nextOrBack(0)),
      HomeBoard(slideList[2], "Sign In",
          () => replacement(context, AuthScreen.id2.toString()), "Sign Up", 
          () => replacement(context, AuthScreen.id.toString())),
    ];
    return MaterialApp(
      home: Scaffold(
        // salah satu widget yang harus masuk list. karena dengan stack sangat mudah untuk menyatukan ke-2 widget yang posisinya
        // berbeda. 
        body: Stack(
          children: <Widget>[
            Container(
                child: PageView.builder(
              itemCount: _widgest.length,
              physics: new AlwaysScrollableScrollPhysics(),
              controller: _controller,
              itemBuilder: (BuildContext context, int index) {
                return _widgest[index % _widgest.length];
              },
            )),
                new Positioned(
                  bottom: 100,
                  left: 0.0,
                  right: 0.0,
                  child: new Container(
                    child: new Center(
                        child: SmoothPageIndicator(
                      controller: _controller,
                      count: _widgest.length,
                      effect: WormEffect(
                        dotWidth: 10,
                        dotHeight: 10,
                        radius: 10,
                        activeDotColor: red,
                      ),
                    )),
                  ),
                ),
          ],
        ),
      ),
    );
  }
}