ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ํ•˜๋ฉด์„œ ์ „์ฒด์ ์ธ ํ…Œ๋งˆ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฒ•์„ ๊ณต๋ถ€ํ•˜๋„๋ก ํ•˜์ž

Flutter ์˜ THEME๋Š” ์•ฑ์ „์ฒด์—์„œ ํŠน์ •ํ•œ ์ƒ‰์ƒ์ด๋‚˜ ๊ธ€๊ผด์„ ํ†ต์ผ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ์ด ๋˜์–ด์ง„๋‹ค. ๋˜ํ•œ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์„ค์ •ํ•œ THEME๋ฅผ ํ†ตํ•ด ๋ถ€๋ถ„์ ์œผ๋กœ ๋ณ€ํ™”๋ฅผ ์ฃผ๊ฑฐ๋‚˜, ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ๋„ ํ•˜๋‹ค.

1. ์‹œ์ž‘์ฝ”๋“œ

์‹œ์ž‘ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

main.dart์—์„œ๋Š” first_page.dart๋ฅผ ๋ถ€๋ฅธ๋‹ค.

first_page์—์„œ๋Š” ๋ฉ”์ธ์—์„œ ์„ ์–ธํ•œ ํ…Œ๋งˆ๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋ ค ํ•œ๋‹ค.

second_page์—์„œ๋Š” ๋ฉ”์ธ์—์„œ ์„ ์–ธํ•œ ํ…Œ๋งˆ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š”๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋ ค ํ•œ๋‹ค.

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

import 'first_page.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyFirstPage(),
    );
  }
}
  • first_page.dart
import 'package:flutter/material.dart';

import 'second_page.dart';

class MyFirstPage extends StatefulWidget {
  @override
  _MyFirstPageState createState() => _MyFirstPageState();
}

class _MyFirstPageState extends State<MyFirstPage> {
  @override
  Widget build(BuildContext context) {
    //TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('First page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('์ „์ฒด ํ…Œ๋งˆ๋ฅผ ์ ์šฉํ•˜๊ธฐ์ „'),
            RaisedButton(
              onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (BuildContext context) => MySecondPage()));
              },
              child: Text('๋‹ค์Œ ํŽ˜์ด์ง€'),
            ),
          ],
        ),
      ),
    );
  }
}
  • second_page.dart
import 'package:flutter/material.dart';

class MySecondPage extends StatefulWidget {
  _MySecondPageState createState() => _MySecondPageState();
}

class _MySecondPageState extends State<MySecondPage> {
  @override
  Widget build(BuildContext context) {
    //TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('Second page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('์ „์ฒด ํ…Œ๋งˆ๋ฅผ ์ ์šฉํ•œ ํ›„'),
            RaisedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text('์ด ํŽ˜์ด์ง€'),
            ),
          ],
        ),
      ),
    );
  }
}

2. main์— ์—ฌ๋Ÿฌ ํ…Œ๋งˆ๋“ค์„ ์„ ์–ธํ•˜์—ฌ ์ค€๋‹ค.

https://blog.kakaocdn.net/dn/nJP16/btqAU7pQBm3/lXMtDmecfuvsCvhqwG2LO1/img.png

ThemeData๋ฅผ ๋“ค์–ด๊ฐ€์„œ ๋ณด๊ฒŒ ๋˜๋ฉด ์ •๋ง๋งŽ์€ ํ…Œ๋งˆ๋“ค์„ ์„ค์ •ํ• ์ˆ˜ ์žˆ์Œ์„ ์•Œ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ์€ main.dart์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์„ ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •์‹œ ๋ชจ๋“  appbar์˜ ๋ฐฐ๊ฒฝ์ƒ‰์ด deep orange์ƒ‰์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๊ธ€์ž๋“ค์€ ์•„์ง ์•„๋ฌด ๋ณ€ํ™”๊ฐ€ ์—†์„๊ฒƒ์ด๋‹ค.

import 'package:flutter/material.dart';

import 'first_page.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        appBarTheme: AppBarTheme(
          color: Colors.deepOrange,
        ),
        textTheme: TextTheme(
          display1: TextStyle(
            fontSize: 30,
            color: Colors.deepOrange,
          ),
        ),
      ),
      home: MyFirstPage(),
    );
  }
}

3. ํŠน์ • ํŽ˜์ด์ง€์— ํŠน์ • ํ…Œ๋งˆ ์„ค์ •ํ•˜๋Š”๋ฒ•

TextStyle๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์€ main์—์„œ ์„ค์ •ํ•˜์—ฌ ์ค€๊ฒƒ๋“ค์„ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ์ธ๋ฐ ํ…์ŠคํŠธ ์Šคํƒ€์ผ์˜ ๊ฒฝ์šฐ 5๊ฐœ ๊นŒ์ง€ ์„ค์ •์„ ๋ฏธ๋ฆฌ ํ•ด๋‘˜์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ์„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Theme.of(context).textTheme.display1 ๊ณผ ๊ฐ™์€ ํ˜•์‹์ด๋‹ค. second_page.dart์—์„œ Text๋ถ€๋ถ„์— style์— ์ ์šฉ์„ ์‹œ์ผฐ๋‹ค.

  • second_page.dart
import 'package:flutter/material.dart';

class MySecondPage extends StatefulWidget {
  _MySecondPageState createState() => _MySecondPageState();
}

class _MySecondPageState extends State<MySecondPage> {
  @override
  Widget build(BuildContext context) {
    //TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text('Second page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '์ „์ฒด ํ…Œ๋งˆ๋ฅผ ์ ์šฉํ•œ ํ›„',
              style: Theme.of(context).textTheme.display1,
              ///Theme.of(context).textTheme.display1.copyWith(color: Colors.blue),
            ),
            RaisedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text('์ด ํŽ˜์ด์ง€'),
            ),
          ],
        ),
      ),
    );
  }
}

์—ฌ๊ธฐ์„œ main์—์„œ ์„ค์ •ํ•œ ํ…์ŠคํŠธ์Šคํƒ€์ผ์„ ์กฐ๊ธˆ์†๋ณด๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์กฐ๊ฑด์ด ์žˆ์„๋•Œ๋Š”

Theme.of(context).textTheme.display1.copyWith(์ž์‹ ์ด ์›ํ•˜๋Š” ์˜ต์…˜ : ์˜ต์…˜ ๊ฐ’) ์„ ์„ค์ •ํ•˜์—ฌ ์ฃผ๋ฉด ๋œ๋‹ค.

์ด ์™ธ์—๋„ buttonTheme, primaryColor, backgroundColor, dividerTheme๋“ฑ ์ •๋ง ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ๊ณ  ์ด๋“ค์„ ํ†ตํ•ด ์•ฑ์„ ๋” ํ†ต์ผ์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค์ˆ˜๊ฐ€ ์žˆ๋‹ค.