새 화면으로 이동하며 데이터를 넘겨줘야 할 때. 플러터 쿡북에서 단서를 찾았다.
기억하세요: 화면은 단지 위젯입니다.
https://flutter-ko.dev/docs/cookbook/navigation/passing-data
위젯에 데이터를 넘겨주기 위해 필요한 것은 파라미터!
1 2 3 4 5 6 | Navigator.push( context, MaterialPageRoute( builder: (context) => DetailScreen(todo: todos[index]), ), ); |
Reference: https://flutter-ko.dev/docs/cookbook/navigation/passing-data
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 | import 'package:flutter/material.dart' ; /// Todo를 표현하기 위한 간단한 정보가 필요합니다. /// 이 예제에서는 두 가지의 데이터를 갖고 있는 클래스를 정의할 것입니다: 제목과 상세 설명 class Todo { final String title; final String description; Todo( this .title, this .description); } void main() { runApp(MaterialApp( title: 'Passing Data' , home: TodosScreen( /// 20개의 todo를 생성하고 ListView를 사용하여 보여줄 것입니다. /// Todo 리스트 생성하기 todos: List.generate( 20 , (i) => Todo( 'Todo $i' , 'A description of what needs to be done for Todo $i' , ), ), ), )); } class TodosScreen extends StatelessWidget { final List<Todo> todos; const TodosScreen({Key? key, required this .todos}) : super (key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text( 'Todos' ), ), /// ListView를 사용하여 Todo 리스트 보여주기 /// 상세 화면으로 이동하면서 데이터를 전달합니다. /// 앞서 작성한 DetailsScreen으로 화면 전환할 준비가 되었습니다. /// 본 예제에서는 사용자가 Todo 리스트 중 하나를 선택했을 때, DetailsScreen으로 화면 전환하도록 할 것입니다. /// 그와 동시에 DetailsScreen에 Todo를 전달할 것입니다. body: ListView.builder( itemCount: todos.length, itemBuilder: (context, index) { /// 사용자의 탭 동작을 감지하기 위해, ListTile 위젯에 onTap 콜백을 작성할 것입니다. /// onTap 콜백 내에서 다시 한 번 Navigator.push 메서드를 사용할 것입니다. return ListTile( title: Text(todos[index].title), // 사용자가 ListTile을 선택하면, DetailScreen으로 이동합니다. // DetailScreen을 생성할 뿐만 아니라, 현재 todo를 같이 전달해야 // 한다는 것을 명심하세요. onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => DetailScreen(todo: todos[index]), ), ); }, ); }, ), ); } } /// Todo에 대한 상세 정보를 보여줄 수 있는 화면을 생성합니다. /// 이제 두 번째 화면을 만들겠습니다. 화면의 제목은 Todo의 제목을 포함하며 본문에는 상세 설명을 보여줄 것입니다. /// 두 번째 화면은 일반적인 StatelssWidget이므로, 생성자 매개변수로 Todo를 받을 수 있게 간단한 방법으로 강제하겠습니다. /// 그러면 주어진 Todo를 활용하여 UI를 그릴 수 있습니다. class DetailScreen extends StatelessWidget { // Todo를 들고 있을 필드를 선언합니다. final Todo todo; // 생성자는 Todo를 인자로 받습니다. const DetailScreen({Key? key, required this .todo}) : super (key: key); @override Widget build(BuildContext context) { // UI를 그리기 위해 Todo를 사용합니다. return Scaffold( appBar: AppBar( title: Text(todo.title), ), body: Padding( padding: const EdgeInsets.all( 16.0 ), child: Text(todo.description), ), ); } } |

