λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“± Mobile/ν”ŒλŸ¬ν„° μ•±ν”„λ‘œκ·Έλž˜λ°

ν”ŒλŸ¬ν„° μ•±ν”„λ‘œκ·Έλž˜λ° Day7

ν”ŒλŸ¬ν„° μ•±ν”„λ‘œκ·Έλž˜λ° Day7

 

μ§€λ‚œ μ‹œκ°„μ—λŠ” 계산기λ₯Ό λ§Œλ“€μ–΄ λ΄€μ—ˆλ‹€.

μ΄λ²ˆμ—λŠ” 'νƒ­(tab)' 에 λŒ€ν•΄ μ•Œμ•„λ³Ό 것이닀. 

μš°λ¦¬κ°€ 보톡 μΈμŠ€νƒ€κ·Έλž¨μ΄λ‚˜, μΉ΄μΉ΄μ˜€ν†‘μ—μ„œ μ•„μ£Ό 많이 μ‚¬μš©ν•˜λŠ” νƒ­λ°”λ₯Ό μ•Œκ³  μžˆλ‹€λ©΄

κΈ°λŠ₯ 이해에 λŒ€ν•΄μ„œλŠ” 쑰금 μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€. 

 

 

 

각 화면을 νƒ­μœΌλ‘œ μ—°κ²°ν•œ νƒ­λ°”λ₯Ό μ΄μš©ν•˜λ©΄ κ΄€λ ¨ μžˆλŠ” λ‚΄μš©λΌλ¦¬ 묢을 수 μžˆλ‹€. 

λ©”μΈν™”λ©΄μ—μ„œ 탭을 눌러 화면을 이동할 수 있기 λ•Œλ¬Έμ— μ’€ 더 직관적인 앱을 λ§Œλ“€ 수 μžˆλ‹€. 

 

 

 

μ—¬λŸ¬ νŽ˜μ΄μ§€ λ§Œλ“€κ³  μ΄λ™ν•˜κΈ° 

μš°μ„ , μ—¬λŸ¬ 화면을 λ§Œλ“€κ³  각 화면을 탭바에 μ—°κ²°ν•΄ μ‚¬μš©μžκ°€ 탭을 λˆŒλ €μ„ λ•Œ ν™”λ©΄μœΌλ‘œ μ΄λ™ν•˜λŠ” 앱을 κ΅¬ν˜„ν•΄λ³΄κ² λ‹€.

 

λͺ¨λ°”일 μ•± κ°œλ°œμ—μ„œλŠ” 이λ₯Ό λ‚΄λΉ„κ²Œμ΄μ…˜(navigation)이라고 ν•œλ‹€. 

λ‚΄λΉ„κ²Œμ΄μ…˜μ€ λ‹€μŒ ν¬μŠ€νŒ… λ•Œ 닀뀄보고 μ˜€λŠ˜μ€ νƒ­λ°”λ₯Ό μ΄μš©ν•΄λ³΄κ² λ‹€. 

 

class FirstApp extends StatelessWidget {
	@override
    Widget build(BuildContext context) {
    	return Scaffold(
        	body: Container(
            	child: Center(
                	child: Text("First Page"),
                ),
             ),
          );
       }
    }

 

sub 폴더에 secondPage.dartλ₯Ό λ§Œλ“€κ³  μœ„μ˜ μ½”λ“œμ™€ λ˜‘κ°™μ΄ Text만 λ³€κ²½ν•΄ SecondApp 클래슀λ₯Ό μž‘μ„±ν•œλ‹€.

 

νƒ­λ°” μœ„μ ―μ„ μ‚¬μš©ν•˜λ €λ©΄ νƒ­ μ»¨νŠΈλ‘€λŸ¬κ°€ ν•„μš”ν•˜λ‹€.

main.dartμ—μ„œ _MyHomePageState 클래슀λ₯Ό μ•„λž˜μ™€ 같이 μˆ˜μ •ν•œλ‹€. 

with ν‚€μ›Œλ“œλ₯Ό μΆ”κ°€ν•˜κ³  SingleTickerProviderStateMixin 클래슀λ₯Ό 지정해야 vsync:this에 였λ₯˜κ°€ 사라진닀. 

 

class _MyHomePageState extends State<MyHomePage> 
	with SingleTickerProviderStateMixin {
	TabController? controller;
    
    @override
    void initState() {
    	super.initState();
        controller = TabController(length: 2, vsync: this);
        // length : λͺ‡ 개의 탭을 λ§Œλ“€ 지 정함 
        // vsync : 탭이 이동할 λ•Œ ν˜ΈμΆœλ˜λŠ” 콜백 ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ²˜λ¦¬ν•  지 κ²°μ •
     }
  }

 

νƒ­ μ»¨νŠΈλ‘€λŸ¬λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ„ μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— dispose() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ€˜μ•Ό

λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 막을 수 μžˆλ‹€. 

_MyHomePageState() ν΄λž˜μŠ€μ— μ•„λž˜ μž¬μ •μ˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ€€λ‹€. 

 

'''

@override
void dispose() {
	controller!.dispose();
    super.dispose();
}

'''

 

이제 ν™”λ©΄ ꡬ성을 해보겠닀.

μŠ€μΊν΄λ“œλ‘œ appBar와 body 그리고 bottomNavigation을 μ„ μ–Έν•œλ‹€. 

bodyμ—λŠ” TabBarView μœ„μ ―μ„, bottomNavigationμ—λŠ” TabBar μœ„μ ―μ„ λ§Œλ“ λ‹€. 

 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('TabBar Example'),
        ),
        body: TabBarView(
          children: <Widget>[FirstApp(), SecondApp()],
          controller: controller,
        ),
        bottomNavigationBar: TabBar(tabs: <Tab>[
          Tab(icon: Icon(Icons.looks_one, color: Colors.blue),) ,
          Tab(icon: Icon(Icons.looks_two, color: Colors.blue),)
        ], controller: controller,
        )
    );
  }

 

 

 

 

728x90