Flutter 모방 위 챗 결제 인터페이스
왼쪽 은 위 챗 결제 인터페이스 이 고 오른쪽 은 개발 완료 후의 효과 이 며 아이콘 은 iconform 에서 다운로드 합 니 다.먼저 이 편 에 관련 된 구성 요 소 를 소개 합 니 다.
장식 효과 가 있 는 컨테이너
실제 과정 에서 우 리 는 원 각,배경 색 등 추가 적 인 스타일 이 필요 한 용 기 를 자주 만 날 수 있다.Flutter 에 서 는 각종 용기 에 하나의 decoration 속성 이 있어 용 기 를 장식 할 수 있 습 니 다.전형 적 인 용법 은 배경 색,원 각,테두리 와 그림자 등 을 설정 하 는데 그 중에서 배경 색 은 그 라 데 이 션 색 을 사용 할 수 있다.decoration 은 장식 대상 으로 가장 많이 사용 되 는 것 은 BoxDecoration 입 니 다.BoxDecoration 의 속성 은 다음 과 같 습 니 다.
const BoxDecoration({
this.color,
this.image,
this.border,
this.borderRadius,
this.boxShadow,
this.gradient,
this.backgroundBlendMode,
this.shape = BoxShape.rectangle,
})
그 중에서 color 는 색상 으로 용 기 를 채 우 고 image 는 그림 을 배경 으로 하고 border 는 테두리 이 며 border Radius 는 테두리 의 원 각 이 고 box Shadow 는 용기 그림자 이 며 gradient 는 그 라 데 이 션 색 을 배경 으로 합 니 다.backgroundBlendMode 는 용기 와 의 혼합 모델 을 말 합 니 다.기본 값 은 커버 이 고 shape 는 배경 모양 이 며 기본 값 은 사각형 입 니 다.그 중에서 배경 부분 은 우 리 는 보통 한 가지 만 선택한다.여기에 위의 녹색 원호 배경 을 예 로 들 면 약간의 점 변(점 변 색 은 여러 개 를 지원 하고 필요 에 따라 조절 할 수 있다)을 더 했다.예시 코드 는 다음 과 같다.
return Container(
//......
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.0),
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0xFF56AF6D),
Color(0xFF56AA6D),
]),
),
//...
);
여기에 변 각 을 원호 로 설정 하고 반경 은 4 이 며 그 라 데 이 션 색 으로 채 우 고 그 라 데 이 션 방향 은 상단 중앙 에서 끝까지 중앙 으로 그 라 데 이 션 색 은 두 개 입 니 다.Row 줄 레이아웃 과 Column 열 레이아웃
이것 은 앞의 다섯 번 째 목록 편 에서 소 개 된 것 입 니 다.그 중에서 Row 는 줄 레이아웃(즉,하위 요 소 는 한 줄 로 배열)을 대표 하고 Column 은 열 레이아웃(즉,하위 요 소 는 한 열 로 배열)을 대표 합 니 다.구체 적 으로 Flutter 입문 과 실전(5):그림 과 글 이 모두 훌륭 한 목록 을 참고 할 수 있 습 니 다.
ListView 목록 구성 요소
목록 보 기 는 이전 편 과 마찬가지 로 이 편의 용법 만 다 릅 니 다.전체 페이지 를 목록 에 따라 스크롤 할 수 있 도록 합 니 다.각 부분 구성 요 소 를 목록 의 children 속성 에 직접 넣 습 니 다.배열 로 목록 요 소 를 구축 하 는 것 이 아니 라 스크롤 보기 와 유사 합 니 다.
GridView 격자 구성 요소
GridView 는 하나의 용 기 를 행렬 에 따라 구분 하 는 데 사 용 됩 니 다.주축 의 요소 개 수 를 지정 할 수 있 습 니 다(스크롤 방향 에 따라 정 합 니 다).그 다음 에 총 요소 의 개수 에 따라 격자 에 자동 으로 채 울 수 있 습 니 다.예 를 들 어 세로 로 스크롤 할 때 줄 방향 에 몇 개의 격자 가 있 는 지 지정 할 수 있 습 니 다.각 격자 마다 요 소 를 지정 할 수 있 습 니 다.한 줄 의 수 를 초과 하면 자동 으로 다른 줄 로 바 뀝 니 다.가장 간단 한 용법 은 GridView.count 방법 으로 GridView 를 구축 하 는 것 입 니 다.용법 은 다음 과 같 습 니 다.
GridView.count(
crossAxisSpacing: gridSpace,
mainAxisSpacing: gridSpace,
crossAxisCount: crossAxisCount,
// , GridView , ListView
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
children: buttons.map((item) {
return _getMenus(item['icon'], item['name'], color: textColor);
}).toList(),
);
여기 crossAxis Spacing 은 스크롤 방향 과 수직 인 요소 의 간격 입 니 다.예 를 들 어 세로(기본 값)로 스크롤 하면 가로 줄 요소 간 의 간격 입 니 다.mainAxis Spacing 은 스크롤 방향 과 같은 요소 의 간격 입 니 다.children 은 격자 에 있 는 요소 입 니 다.여기 서 주의해 야 할 것 은 이 예 에서 GridView 는 ListView 에 포 함 된 것 이기 때문에 두 구성 요 소 는 모두 세로 로 스크롤 되 어 충돌 을 일 으 켜 레이아웃 이 제약 을 만족 시 키 지 못 할 수 있 습 니 다.따라서 여기에서 shrinkWrap 을 true 로 설정 하고 physics 를 Never Scrollable ScrollPhysics 로 설정 하여 GridView 의 스크롤 을 금지 하여 제약 을 만족 시 킵 니 다.코드 구현
먼저 레이아웃 을 분석 합 니 다.모든 메뉴 단 추 는 똑 같은 레이아웃 입 니 다.통 일 된 열 레이아웃 으로 메뉴 단 추 를 완성 하고 재 활용 성 을 높 일 수 있 습 니 다.메뉴 단 추 는 위 에서 다음 까지 아이콘,간격(아이콘 과 텍스트 사이),메뉴 이름 입 니 다.구현 코드 는 다음 과 같 습 니 다:
Column _getMenus(String icon, String name, {Color color = Colors.black}) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(
child: Image.asset(icon),
width: 50,
height: 50,
),
SizedBox(
height: 5,
),
Text(name, style: TextStyle(fontSize: 14.0, color: color, height: 2)),
],
);
아이콘 이름,메뉴 이름과 선택 할 수 있 는 글꼴 색상(상단 영역 과 다른 텍스트 색상 이 다 름)을 전송 하여 하나의 메뉴 를 만 듭 니 다.그 다음 에 상단 구역 을 보면 상단 구역 은 두 개의 버튼 만 있 고 장식 이 있 는 용 기 를 사용 하여 배경 장식 과 원 각 을 실현 합 니 다.줄 레이아웃 을 사용 하여 두 메뉴 단 추 를 가로로 고 르 게 배열 합 니 다.동시에 Center 레이아웃 을 사용 하여 두 메뉴 를 가운데 로 유지 합 니 다.여기에 용기 의 높이 가 지 정 된 것 은 미관 상 으로 는 너무 작 아 어 울 리 지 않 기 때문에 실제 개발 은 UI 설계 원고 에 따라 정 해 야 한다.
Widget _headerGridButtons() {
double height = 144;
List<Map<String, String>> buttons = GridMockData.headerGrids();
return Container(
height: height,
margin: EdgeInsets.fromLTRB(MARGIN, MARGIN, MARGIN, MARGIN / 2),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.0),
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0xFF56AF6D),
Color(0xFF56AA6D),
]),
),
child: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: buttons
.map((item) =>
_getMenus(item['icon'], item['name'], color: Colors.white))
.toList()),
),
);
}
다른 메뉴 레이아웃 은 모두 같 습 니 다.지역 제목 만 있 고 메뉴 의 수량,메뉴 내용 이 다 르 기 때문에 일반적인 방법 으로 임의의 형식의 메뉴 를 구축 하고 지역 제목 의 글꼴 스타일,원 각 배경 등 속성 을 설정 할 수 있 습 니 다.메뉴 는 모두 GridView 를 사용 하여 네트워크 형식 레이아웃 을 실현 하 는 동시에 메뉴 레이아웃 이 같 기 때문에 일반적인 방법 으로 격자 한 줄 단추 의 수량,단추 글꼴 색상 등 속성 을 지정 하여 코드 의 재 활용 을 실현 할 수 있 습 니 다.
Widget _dynamicGridButtons(List<Map<String, String>> buttons, String title,
{int crossAxisCount = 4}) {
return Container(
margin: EdgeInsets.fromLTRB(MARGIN, MARGIN, MARGIN, MARGIN / 2),
padding: EdgeInsets.all(MARGIN),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.0),
color: Colors.white,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: TextStyle(color: Colors.grey[700]),
),
SizedBox(height: 20),
_gridButtons(buttons, crossAxisCount, textColor: Colors.black),
],
),
);
}
GridView _gridButtons(List<Map<String, String>> buttons, int crossAxisCount,
{Color textColor = Colors.white}) {
double gridSpace = 5.0;
return GridView.count(
crossAxisSpacing: gridSpace,
mainAxisSpacing: gridSpace,
crossAxisCount: crossAxisCount,
// , GridView , ListView
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
children: buttons.map((item) {
return _getMenus(item['icon'], item['name'], color: textColor);
}).toList(),
);
}
}
ListView 는 전체 페이지 를 구축 합 니 다.실제 전체 페이지 는 간단 합 니 다.각 영역 을 ListView 의 children 속성 에 넣 으 면 됩 니 다.여기 서 알 수 있 듯 이 하위 구성 요 소 를 가능 한 한 세분 화하 면 코드 의 재 활용 성 을 높 일 수 있 을 뿐만 아니 라 내장 등급 도 낮 추고 코드 의 가 독성 과 유지 가능성 도 높 일 수 있 습 니 다.
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: [
_headerGridButtons(),
_dynamicGridButtons(GridMockData.financeGrids(), ' '),
_dynamicGridButtons(GridMockData.serviceGrids(), ' '),
_dynamicGridButtons(GridMockData.thirdpartyGrids(), ' '),
],
),
);
}
Mock 데이터 준비단추 데 이 터 는 모두 Mock 데 이 터 를 사용 합 니 다.여 기 는 List
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Flutter】DateTime 전월의 일수를 취득한다달의 일수를 취득할 필요가 있어, 의외로 수요 있을까라고 생각했으므로 비망록 정도에 남겨 둡니다. DateTime 날짜에 0을 입력하면 전월 DateTime이 됩니다. 2021년 3월 0일 = 2021년 2월 28일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.