Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion client/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c

COCOAPODS: 1.10.1
COCOAPODS: 1.10.0
28 changes: 28 additions & 0 deletions client/lib/protos/pkg/pr12er/messages.pb.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion client/lib/protos/pkg/pr12er/messages.pbjson.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

83 changes: 38 additions & 45 deletions client/lib/screens/detail_screen.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:pr12er/protos/pkg/pr12er/messages.pb.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';
import 'package:pr12er/widgets/detail/header.dart';
import 'package:pr12er/utils/extractor.dart';
import 'package:pr12er/widgets/detail/youtube.dart';

class DetailScreenArguments {
final Video video;
Expand All @@ -12,59 +13,51 @@ class DetailScreenArguments {
class DetailScreen extends StatelessWidget {
static const String routeName = "detail_app";

Widget getHorizontalLine() {
return const Divider(
height: 5,
color: Colors.black,
indent: 5,
endIndent: 5,
);
}

@override
Widget build(BuildContext context) {
final args =
// ignore: cast_nullable_to_non_nullable
ModalRoute.of(context)!.settings.arguments as DetailScreenArguments;

return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
},
),
title: Text(args.video.title,
key: const ValueKey("$routeName/appBar/title")),
appBar: AppBar(
leading: IconButton(
icon: const Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
},
),
body: Detail(youtubeId: extractYoutubeId(args.video.link)));
}
}

class Detail extends StatefulWidget {
final String youtubeId;

const Detail({required this.youtubeId});

@override
_DetailState createState() => _DetailState();
}

class _DetailState extends State<Detail> {
late final YoutubePlayerController _controller;

@override
void initState() {
super.initState();

_controller = YoutubePlayerController(
initialVideoId: widget.youtubeId,
);
}

@override
Widget build(BuildContext context) {
return YoutubePlayerBuilder(
player: YoutubePlayer(
controller: _controller,
title: Text(args.video.title,
key: const ValueKey("$routeName/appBar/title")),
),
body: CustomScrollView(
slivers: [
SliverList(
delegate: SliverChildListDelegate([
YoutubeWidget(youtubeId: extractYoutubeId(args.video.link)),
Container(
margin: const EdgeInsets.only(top: 5, left: 10, right: 10),
child: Column(
children: [
HeaderWidget(video: args.video),
const SizedBox(height: 10),
getHorizontalLine(),
const SizedBox(height: 10),
],
),
)
]))
],
),
builder: (context, player) {
return Column(
children: [player],
);
},
);
}
}
10 changes: 10 additions & 0 deletions client/lib/widgets/detail/abstract.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

실수로 들어간 파일 같네요

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 디테일뷰 섹션 분리를

  1. 헤더 (시청 수, 좋아요 수, 발표자 등)
  2. 논문 abstract 열람
  3. 코드 저장소 목록
  4. 추천 논문 목록

으로 채울 생각입니다. abstract.dart는 이 중 두 번째 위젯에 해당합니당

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

abstract 이 키워드라서 PaperAbstract 라고 명시해주시면 좋을 것 같아요.
나중에 보시면 수정


class AbstractWidget extends StatelessWidget {
const AbstractWidget({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container();
}
}
68 changes: 68 additions & 0 deletions client/lib/widgets/detail/header.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import 'package:flutter/material.dart';
import 'package:pr12er/protos/pkg/pr12er/messages.pb.dart';

// ignore: must_be_immutable
class HeaderWidget extends StatelessWidget {
// this is a placeholder
// didILIkedIt should be replaced in the next future PR
// after defining user related information
bool didILikedIt = false;

late Video video;

HeaderWidget({Key? key, required this.video}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.only(top: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
...getPresenterWidgets(),
const SizedBox(width: 25),
...getViewNumbersWidgets(),
const SizedBox(width: 25),
...getDateWidgets(),
],
),
);
}

Widget getLikeIcon() {
if (didILikedIt) {
return const Icon(Icons.thumb_up_alt);
}
return const Icon(Icons.thumb_up_alt_outlined);
}

List<Widget> getViewNumbersWidgets() {
return [
const SizedBox(width: 8),
const Icon(Icons.remove_red_eye),
const SizedBox(width: 8),
Text(video.numberOfViews.toString(),
style: const TextStyle(fontSize: 18)),
const SizedBox(width: 15),
getLikeIcon(),
const SizedBox(width: 8),
Text(video.numberOfLike.toString(), style: const TextStyle(fontSize: 18)),
];
}

List<Widget> getPresenterWidgets() {
return [
Text(video.presenter,
style: const TextStyle(
color: Colors.black54, fontSize: 18, fontStyle: FontStyle.italic))
];
}

List<Widget> getDateWidgets() {
return [
const Icon(Icons.today),
const SizedBox(width: 8),
Text(video.publishedDate, style: const TextStyle(fontSize: 18))
];
}
}
10 changes: 10 additions & 0 deletions client/lib/widgets/detail/recommendataion.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';

class RecommentationWidget extends StatelessWidget {
const RecommentationWidget({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container();
}
}
10 changes: 10 additions & 0 deletions client/lib/widgets/detail/repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';

class RepositoryWidget extends StatelessWidget {
const RepositoryWidget({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container();
}
}
38 changes: 38 additions & 0 deletions client/lib/widgets/detail/youtube.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:youtube_player_flutter/youtube_player_flutter.dart';

class YoutubeWidget extends StatefulWidget {
final String youtubeId;

const YoutubeWidget({Key? key, required this.youtubeId}) : super(key: key);

@override
_DetailState createState() => _DetailState();
}

class _DetailState extends State<YoutubeWidget> {
late final YoutubePlayerController _controller;

@override
void initState() {
super.initState();

_controller = YoutubePlayerController(
initialVideoId: widget.youtubeId,
);
}

@override
Widget build(BuildContext context) {
return YoutubePlayerBuilder(
player: YoutubePlayer(
controller: _controller,
),
builder: (context, player) {
return Column(
children: [player],
);
},
);
}
}
Loading