Skip to content

Commit 5bae899

Browse files
committed
update widgets
1 parent e24edc9 commit 5bae899

File tree

2 files changed

+117
-125
lines changed

2 files changed

+117
-125
lines changed

dataconnect/lib/movie_detail.dart

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:async';
2+
13
import 'package:dataconnect/movie_state.dart';
24
import 'package:dataconnect/movies_connector/movies.dart';
35
import 'package:dataconnect/widgets/login_guard.dart';
@@ -20,24 +22,59 @@ class _MovieDetailState extends State<MovieDetail> {
2022
GetMovieByIdData? data;
2123
bool _favorited = false;
2224

23-
final TextEditingController _reviewTextController = TextEditingController();
25+
final _reviewTextController = TextEditingController();
26+
StreamSubscription? _movieByIdSub, _movieInfoSub;
27+
2428
@override
2529
void initState() {
2630
super.initState();
31+
init(widget.id);
32+
}
2733

28-
MovieState.subscribeToMovieById(widget.id).listen((value) {
29-
if (mounted) {
30-
setState(() {
31-
loading = false;
32-
data = value.data;
33-
});
34-
}
35-
});
34+
@override
35+
void dispose() {
36+
_movieByIdSub?.cancel();
37+
_movieInfoSub?.cancel();
38+
super.dispose();
39+
}
40+
41+
@override
42+
void didUpdateWidget(covariant MovieDetail oldWidget) {
43+
super.didUpdateWidget(oldWidget);
44+
if (oldWidget.id != widget.id) {
45+
init(widget.id);
46+
}
47+
}
48+
49+
Future<void> init(String id) async {
50+
_movieByIdSub?.cancel();
51+
_movieInfoSub?.cancel();
52+
_movieByIdSub = MovieState.subscribeToMovieById(widget.id).listen(
53+
(value) {
54+
if (mounted) {
55+
setState(() {
56+
loading = false;
57+
data = value.data;
58+
});
59+
}
60+
},
61+
);
62+
_movieInfoSub = MovieState.subscribeToGetMovieInfo(widget.id).listen(
63+
(value) {
64+
if (mounted) {
65+
setState(() {
66+
_favorited = value.data.favorite_movie != null;
67+
});
68+
}
69+
},
70+
);
71+
}
3672

37-
MovieState.subscribeToGetMovieInfo(widget.id).listen((value) {
73+
void _toggleFavorite() {
74+
MovieState.toggleFavorite(widget.id, _favorited).then((_) {
3875
if (mounted) {
3976
setState(() {
40-
_favorited = value.data.favorite_movie != null;
77+
_favorited = !_favorited;
4178
});
4279
}
4380
});
@@ -47,14 +84,6 @@ class _MovieDetailState extends State<MovieDetail> {
4784
MovieState.refreshMovieDetail(widget.id);
4885
}
4986

50-
void _toggleFavorite() {
51-
MovieState.toggleFavorite(widget.id, _favorited).then((_) {
52-
setState(() {
53-
_favorited = !_favorited;
54-
});
55-
});
56-
}
57-
5887
@override
5988
Widget build(BuildContext context) {
6089
return Scaffold(

dataconnect/lib/profile.dart

Lines changed: 69 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,118 +1,81 @@
1-
import 'dart:async';
2-
3-
import 'package:dataconnect/movie_state.dart';
4-
import 'package:dataconnect/models/movie.dart';
5-
import 'package:dataconnect/movies_connector/movies.dart';
6-
import 'package:dataconnect/util/auth.dart';
7-
import 'package:dataconnect/widgets/list_movies.dart';
8-
import 'package:dataconnect/widgets/list_reviews.dart';
91
import 'package:firebase_auth/firebase_auth.dart';
10-
import 'package:firebase_data_connect/firebase_data_connect.dart';
112
import 'package:flutter/material.dart';
12-
133
import 'package:go_router/go_router.dart';
144

15-
class Profile extends StatefulWidget {
16-
const Profile({super.key});
17-
18-
@override
19-
State<Profile> createState() => _ProfileState();
20-
}
5+
import 'movie_state.dart';
6+
import 'models/movie.dart';
7+
import 'movies_connector/movies.dart';
8+
import 'widgets/list_movies.dart';
9+
import 'widgets/list_reviews.dart';
2110

22-
class _ProfileState extends State<Profile>
23-
with WidgetsBindingObserver, RouteAware {
24-
User? _currentUser;
25-
List<GetCurrentUserUserFavoriteMoviesMovie> _favoriteMovies = [];
26-
List<GetCurrentUserUserReviews> _reviews = [];
27-
String? _displayName;
28-
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
29-
StreamSubscription<QueryResult<GetCurrentUserData, void>>? _listener;
30-
31-
@override
32-
void initState() {
33-
super.initState();
34-
_listener = MovieState.subscribeToCurrentUser().listen((res) {
35-
if (mounted) {
36-
setState(() {
37-
_displayName = res.data.user!.name;
38-
_favoriteMovies =
39-
res.data.user!.favoriteMovies.map((e) => e.movie).toList();
40-
_reviews = res.data.user!.reviews;
41-
});
42-
}
43-
});
44-
}
45-
46-
@override
47-
void dispose() {
48-
super.dispose();
49-
_listener?.cancel();
50-
}
51-
52-
_refresh() {
53-
MoviesConnector.instance.getCurrentUser().execute();
54-
}
55-
56-
Widget _buildUserInfo() {
57-
return Container(
58-
child: Column(
59-
children: [
60-
Text('Welcome back ${_displayName ?? ''}!'),
61-
TextButton(
62-
onPressed: () async {
63-
FirebaseAuth.instance.signOut();
64-
context.go('/login');
65-
},
66-
child: Text('Sign out'))
67-
],
68-
),
69-
);
70-
}
11+
class Profile extends StatelessWidget {
12+
const Profile({super.key});
7113

7214
@override
7315
Widget build(BuildContext context) {
74-
return _currentUser == null
75-
? const Column(
76-
mainAxisAlignment: MainAxisAlignment.center,
77-
crossAxisAlignment: CrossAxisAlignment.center,
78-
children: [CircularProgressIndicator()],
79-
)
80-
: RefreshIndicator(
16+
return StreamBuilder(
17+
stream: MovieState.subscribeToCurrentUser(),
18+
builder: (context, snapshot) {
19+
final res = snapshot.data;
20+
if (res == null) {
21+
return const Center(
22+
child: CircularProgressIndicator(),
23+
);
24+
}
25+
final displayName = res.data.user!.name;
26+
final favoriteMovies =
27+
res.data.user!.favoriteMovies.map((e) => e.movie).toList();
28+
final reviews = res.data.user!.reviews;
29+
final currentUser = res.data.user;
30+
return RefreshIndicator(
8131
child: SingleChildScrollView(
82-
physics: const AlwaysScrollableScrollPhysics(),
83-
child: Container(
84-
padding: EdgeInsets.all(30),
85-
child: Column(
86-
mainAxisAlignment: MainAxisAlignment.start,
87-
crossAxisAlignment: CrossAxisAlignment.start,
88-
children: [
89-
_buildUserInfo(),
90-
ListMovies(
91-
title: "Favorite Movies",
92-
movies: _favoriteMovies
93-
.map(
94-
(e) => Movie(
95-
id: e.id,
96-
title: e.title,
97-
imageUrl: e.imageUrl),
98-
)
99-
.toList()),
100-
ListReviews(
101-
reviews: _reviews
102-
.map(
103-
(e) => Review(
104-
reviewText: e.reviewText!,
105-
rating: e.rating!,
106-
username: _currentUser!.email!,
107-
date: e.reviewDate),
108-
)
109-
.toList(),
110-
title: "Reviews"),
111-
],
112-
),
113-
)),
32+
physics: const AlwaysScrollableScrollPhysics(),
33+
child: Container(
34+
padding: const EdgeInsets.all(30),
35+
child: Column(
36+
mainAxisAlignment: MainAxisAlignment.start,
37+
crossAxisAlignment: CrossAxisAlignment.start,
38+
children: [
39+
Column(
40+
children: [
41+
Text('Welcome back $displayName !'),
42+
TextButton(
43+
onPressed: () async {
44+
FirebaseAuth.instance.signOut();
45+
context.go('/login');
46+
},
47+
child: const Text('Sign out'))
48+
],
49+
),
50+
ListMovies(
51+
title: "Favorite Movies",
52+
movies: favoriteMovies
53+
.map(
54+
(e) => Movie(
55+
id: e.id,
56+
title: e.title,
57+
imageUrl: e.imageUrl),
58+
)
59+
.toList()),
60+
ListReviews(
61+
reviews: reviews
62+
.map(
63+
(e) => Review(
64+
reviewText: e.reviewText!,
65+
rating: e.rating!,
66+
username: currentUser!.username,
67+
date: e.reviewDate),
68+
)
69+
.toList(),
70+
title: "Reviews"),
71+
],
72+
),
73+
),
74+
),
11475
onRefresh: () async {
115-
await _refresh();
116-
});
76+
MoviesConnector.instance.getCurrentUser().execute();
77+
},
78+
);
79+
});
11780
}
11881
}

0 commit comments

Comments
 (0)