CodeBlanks Logo Icon CodeBlanks

Challenge 3

Build a two-screen flow with Navigator push and pop.

Two-screen flow

To make a two-screen flow, you open a new screen with Navigator.push and return with Navigator.pop. Push creates the new screen via the builder of MaterialPageRoute. Pop closes the top screen and returns to the screen below.

Navigator.push(
  context,
  MaterialPageRoute(builder: (_) => SecondScreen()),
);

Practice Make a simple two-screen flow

Write a function gecisYap that prints Gecis yapildi. Write a StatelessWidget named IkinciEkran. Write a StatelessWidget named BirinciEkran; in its build method, have an ElevatedButton whose onPressed opens IkinciEkran with Navigator.push. In main call gecisYap and start BirinciEkran with runApp.

Starter code

main.dart
import 'package:flutter/material.dart';

// gecisYap fonksiyonu yaz
// IkinciEkran adinda StatelessWidget yaz
// BirinciEkran adinda StatelessWidget yaz, ElevatedButton ile gecis yapsin

void main() {
}

Sample solution

main.dart
import 'package:flutter/material.dart';

void gecisYap() {
  print('Gecis yapildi');
}

class IkinciEkran extends StatelessWidget {
  const IkinciEkran({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(body: Center(child: Text('Ikinci')));
  }
}

class BirinciEkran extends StatelessWidget {
  const BirinciEkran({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (_) => const IkinciEkran()),
              );
            },
            child: Text('Ac'),
          ),
        ),
      ),
    );
  }
}

void main() {
  gecisYap();
  runApp(const BirinciEkran());
}

Expected output

Gecis yapildi

Practice Make a full two-screen flow

Write a function akisBaslat that prints Akis basladi. Write a StatelessWidget named IkinciEkran with an ElevatedButton that returns to the previous screen. Write a StatelessWidget named BirinciEkran that opens a new screen with an ElevatedButton. In main call akisBaslat and start BirinciEkran with runApp.

Starter code

main.dart
import 'package:flutter/material.dart';

// akisBaslat fonksiyonu yaz
// IkinciEkran: geri donen bir ElevatedButton olsun
// BirinciEkran: yeni ekran acan bir ElevatedButton olsun

void main() {
}

Sample solution

main.dart
import 'package:flutter/material.dart';

void akisBaslat() {
  print('Akis basladi');
}

class IkinciEkran extends StatelessWidget {
  const IkinciEkran({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Geri'),
        ),
      ),
    );
  }
}

class BirinciEkran extends StatelessWidget {
  const BirinciEkran({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (_) => const IkinciEkran()),
              );
            },
            child: Text('Ac'),
          ),
        ),
      ),
    );
  }
}

void main() {
  akisBaslat();
  runApp(const BirinciEkran());
}

Expected output

Akis basladi

Questions and answers

Review the lesson questions together with their answers. To test yourself, solve the lesson interactively.

1 Which methods are used together for a two-screen flow?

  • push and pop Correct answer
  • build and setState
  • init and dispose
  • create and destroy

Explanation: In a two-screen flow, push opens a new screen and pop returns; create/destroy, build/setState or init/dispose are not for this purpose.

2 Add the MaterialPageRoute

Question
Navigator.push(
  context,
  ____(builder: (_) => const IkinciEkran()),
);
Answer
Navigator.push(
  context,
  MaterialPageRoute(builder: (_) => const IkinciEkran()),
);

Explanation: To create a Material transition route, the MaterialPageRoute class is used; there is no class named WidgetRoute, ScreenRoute or AppRoute.

3 Navigator parts

Term Meaning
Navigator.push Opens a new screen
Navigator.pop Closes the top screen
MaterialPageRoute Material transition route
builder Callback that builds the screen

All lessons in Beginner