[flutter] 플러터(IndexedStack)에서 인덱스 변경시 이전 페이지의 입력 상태를 유지하는 방법은 무엇인가요?
플러터의 IndexedStack 위젯은 여러 개의 자식 위젯을 배열 형태로 가지며, 현재 인덱스에 해당하는 자식 위젯만 보여주는 위젯입니다. 이 때, 인덱스가 변경되면 이전 페이지의 상태는 사라지게 됩니다. 그러나 어떻게 하면 인덱스를 변경해도 이전 페이지의 입력 상태를 유지할 수 있을까요?
해결 방법은 IndexedStack 위젯과 상태 관리를 위한 StatefulWidget을 조합하여 사용하는 것입니다. StatefulWidget을 사용하면 각자의 상태를 유지하고 필요한 데이터를 저장할 수 있습니다.
다음은 IndexedStack과 StatefulWidget을 조합하여 이전 페이지의 입력 상태를 유지하는 예제 코드입니다.
import 'package:flutter/material.dart';
class MyIndexedStack extends StatefulWidget {
@override
_MyIndexedStackState createState() => _MyIndexedStackState();
}
class _MyIndexedStackState extends State<MyIndexedStack> {
int currentIndex = 0;
List<Widget> pages = [
Page1(),
Page2(),
Page3(),
];
@override
Widget build(BuildContext context) {
return IndexedStack(
index: currentIndex,
children: pages,
);
}
}
class Page1 extends StatefulWidget {
@override
_Page1State createState() => _Page1State();
}
class _Page1State extends State<Page1> {
TextEditingController _textEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _textEditingController,
decoration: InputDecoration(labelText: 'Page 1'),
),
ElevatedButton(
child: Text('Next'),
onPressed: () {
setState(() {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Page2()),
);
});
},
),
],
),
),
);
}
}
class Page2 extends StatefulWidget {
@override
_Page2State createState() => _Page2State();
}
class _Page2State extends State<Page2> {
TextEditingController _textEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _textEditingController,
decoration: InputDecoration(labelText: 'Page 2'),
),
ElevatedButton(
child: Text('Next'),
onPressed: () {
setState(() {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Page3()),
);
});
},
),
],
),
),
);
}
}
class Page3 extends StatefulWidget {
@override
_Page3State createState() => _Page3State();
}
class _Page3State extends State<Page3> {
TextEditingController _textEditingController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _textEditingController,
decoration: InputDecoration(labelText: 'Page 3'),
),
ElevatedButton(
child: Text('Previous'),
onPressed: () {
setState(() {
Navigator.pop(context);
});
},
),
],
),
),
);
}
}
이 예제 코드에서는 IndexedStack을 사용하여 세 개의 페이지를 관리합니다. 각 페이지는 StatefulWidget으로 구성되어 있으며, 입력 상태를 유지하기 위해 TextEditingController를 사용하고 있습니다.
이제 IndexedStack의 인덱스를 변경해도 각 페이지의 상태는 유지됩니다. 예를 들어, Page1에서 입력한 값은 Page2로 이동한 후에도 유지됩니다.
이와 같이 StatefulWidget을 사용하여 IndexedStack의 각 페이지의 상태를 유지할 수 있습니다. 생성된 페이지를 적절히 관리하면서 앱에서 필요한 입력 상태를 유지할 수 있습니다.
더 자세한 내용은 공식 문서를 참조하시기 바랍니다.