개발/Flutter

[Flutter] Navigator, 값 전달/받기

지산동고라니 2021. 11. 11. 18:20

Flutter의 기능 중 꼭 알아야 하는 것이 있다면 바로 Navigator에 대한 것이다. 실제로 다양한 Route방법이 있지만 그 중에서도 조금은 간단한 방법을 기억하고자 글을 적는다.

void main() {
  runApp(MaterialApp(
    title: "MemoApp",
    initialRoute: '/',
    routes: {
      '/': (context) => Root(),
      '/A': (context) => A(),
      '/B': (context) => B(),
    },
  ));
}

다음과 같이 라우트를 등록하고 A화면으로는 값을 수신하고 B화면으로는 값을 발신한다고 하면 다음과 같이 하면된다.

onPressed: () async {
          var result = await Navigator.pushNamed(context, '/A');
          setState(() {
            info.add(result as String);
          });
        },

먼저 Navigator로 등록된 route를 참조하여 화면을 전환하는 코드이다. 코드를 보면 알겠지만 전환된 화면에서 값을 받는 코드는 저렇게 작성할 수 있다. onPressed 이벤트에만 종속되는 것이 아니니 필요한 이벤트에 위의 코드를 쓸 수 있다.

그리고 Route에 등록된 A 클래스를 보자

String text = ""; //class에 정의 되어있는 변수 값

Scaffold(
        appBar: AppBar(title: Text("EditPage")),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Center(
            child: Form(
              child: Column(
                children: [
                  TextFormField(
                    decoration: InputDecoration(hintText: 'SomeText'),
                    onChanged: (value) {
                      text = value;
                    },
                  ),
                  ElevatedButton(
                      onPressed: () {
                        Navigator.pop(context, text); /// 핵심
                      },
                      child: Text("ADD"))
                ],
              ),
            ),
          ),
        ));

코드를 보면 알겠지만, TextFormField에서 값이 변경될 때 마다 변수에 저장하고 그 값을 Add라는 버튼을 클리하면 push된 Navigator를 pop하고 값을 같이 넘겨준다.


그리고 값을 발신하는 예제

onTap: () {
              Navigator.pushNamed(context, '/B', arguments: "Hello");
            },

값을 수신할 때와 마찬가지로 Navigator를 push하는 것은 같으나 이후 argument를 함께 전달해주는 것이 차이점이다.

그리고 나서 B 클래스의 Widget build를 하면서 아래의 코드를 이용해 context에 전달된 argument값을 받아와 자유롭게 사용할 수 있다.

String? tmp = ModalRoute.of(context)?.settings.arguments.toString();