Newer
Older
MiniTias / lib / screens / home_screen.dart
import 'dart:math' as math;

import 'package:flutter/material.dart';
import 'package:screen_brightness/screen_brightness.dart';

import 'package:mini_tias/screens/capture_screen.dart';
import 'package:mini_tias/screens/gallery_screen.dart';

/// BottomNavigationBar で撮影画面と一覧画面を切り替えるホーム画面.
///
/// UI 全体を 180° 回転して表示する(端末を逆さに置いて使用するため).
/// アタッチメントで隠れる下部領域を避け,上部の見える領域に UI を配置する.
class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int _currentIndex = 0;
  double _brightness = 0.8;

  @override
  void initState() {
    super.initState();
    _setBrightness(_brightness);
  }

  @override
  void dispose() {
    ScreenBrightness.instance.resetApplicationScreenBrightness();
    super.dispose();
  }

  Future<void> _setBrightness(double value) async {
    await ScreenBrightness.instance.setApplicationScreenBrightness(value);
  }

  @override
  Widget build(BuildContext context) {
    final screenHeight = MediaQuery.of(context).size.height;
    // アタッチメントで隠れる領域(回転前の下部 = 操作者から見た上部)
    final attachmentPadding = screenHeight / 3;

    return Transform.rotate(
      angle: math.pi,
      child: Scaffold(
        backgroundColor: Colors.black,
        body: Column(
          children: [
            // 操作者に見える領域(回転前の上部)
            // ナビゲーションバー
            BottomNavigationBar(
              currentIndex: _currentIndex,
              onTap: (index) => setState(() => _currentIndex = index),
              backgroundColor: Colors.black87,
              selectedItemColor: Colors.white,
              unselectedItemColor: Colors.white60,
              items: const [
                BottomNavigationBarItem(
                  icon: Icon(Icons.camera_alt),
                  label: '撮影',
                ),
                BottomNavigationBarItem(
                  icon: Icon(Icons.photo_library),
                  label: '一覧',
                ),
              ],
            ),

            // 明るさスライダー
            Container(
              color: Colors.black54,
              padding: const EdgeInsets.symmetric(horizontal: 16),
              child: Row(
                children: [
                  const Icon(
                    Icons.brightness_low,
                    size: 20,
                    color: Colors.white,
                  ),
                  Expanded(
                    child: Slider(
                      value: _brightness,
                      onChanged: (value) {
                        setState(() => _brightness = value);
                        _setBrightness(value);
                      },
                    ),
                  ),
                  const Icon(
                    Icons.brightness_high,
                    size: 20,
                    color: Colors.white,
                  ),
                ],
              ),
            ),

            // メインコンテンツ(カメラプレビュー or 一覧)
            Expanded(
              child: _currentIndex == 0
                  ? const CaptureScreen()
                  : const GalleryScreen(),
            ),

            // アタッチメントで隠れる領域(空白)
            SizedBox(height: attachmentPadding),
          ],
        ),
      ),
    );
  }
}