코딩하는 제리

[Flutter/Project](Instagram Clone) Positioned 위젯 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) Positioned 위젯

JerryCho 2021. 1. 23. 15:46

Positioned 위젯에 의한 exception이 발생했다.

Positioned 위젯은 무조건 Column 또는 Stack 위젯의 바로 아래에 존재해야한다.

 

profile_screen.dart 파일의 Positioned 위젯을 삭제하여 해결.


소스코드 및 pubspec.yaml

// profile_screen.dart

import 'package:flutter/material.dart';
import 'package:flutter_project_IJ/constants/screen_size.dart';
import 'package:flutter_project_IJ/widgets/profile_body.dart';
import 'package:flutter_project_IJ/widgets/profile_side_menu.dart';

enum MenuStatus { opened, closed }

// 클래스 바깥에서 선언한 변수는 다른 파일에서 접근이 가능한 static 변수.
const duration = Duration(milliseconds: 600);

class ProfileScreen extends StatefulWidget {
  @override
  _ProfileScreenState createState() => _ProfileScreenState();
}

class _ProfileScreenState extends State<ProfileScreen> {
  final menuWidth = size.width / 3 * 2; //메뉴 사이즈

  // 메뉴 상태 기본 값(closed)
  MenuStatus _menuStatus = MenuStatus.closed;

  // 메뉴를 열기 전 기본 값.
  double bodyXPos = 0;
  double menuXPos = size.width; //화면 사이즈만큼 우측 밖으로 나가있음

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[100],
      body: Stack(
        children: [
          AnimatedContainer(
            duration: duration,
            curve: Curves.fastOutSlowIn,
            transform: Matrix4.translationValues(bodyXPos, 0, 0),
            child: ProfileBody(onMenuChanged: () {
              setState(() {
                // 메뉴 상태 토글
                // profile_body.dart 파일의 _appbar 메서드에서 버튼이 선태될 때 실행.
                // 메뉴 상태가 closed이면 opened, opend이면 closed로 변경.
                _menuStatus = (_menuStatus == MenuStatus.closed)
                    ? MenuStatus.opened
                    : MenuStatus.closed;

                switch (_menuStatus) {
                  case MenuStatus.opened:
                    bodyXPos = -menuWidth;
                    menuXPos = size.width - menuWidth;
                    break;
                  case MenuStatus.closed:
                    bodyXPos = 0;
                    menuXPos = size.width;
                    break;
                }
              });
            }),
          ),
          AnimatedContainer(
            duration: duration,
            curve: Curves.fastOutSlowIn,
            transform: Matrix4.translationValues(menuXPos, 0, 0),
            child: ProfileSideMenu(menuWidth),
          ),
        ],
      ),
    );
  }
}
Comments