Skip to content

Commit e16110d

Browse files
authored
Merge pull request #134 from GetStream/release-0.3.0
2 parents 242d34c + 181a76f commit e16110d

File tree

110 files changed

+2703
-1084
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+2703
-1084
lines changed

packages/stream_feed/analysis_options.yaml renamed to analysis_options.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
2+
# This is the default analysis_options.yaml for all packages and examples
3+
# If a package needs specific rules, create the analysis_options.yaml on it
4+
# include this file, like:
5+
#
6+
# include: ../../analysis_options.yaml
7+
#
8+
19
analyzer:
210
exclude:
311
- lib/**/*.g.dart

example/lib/activity_item.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
22
import 'package:stream_feed/stream_feed.dart';
33
import 'package:timeago/timeago.dart' as timeago;
44

5-
import 'dummy_app_user.dart';
5+
import 'app_user.dart';
66

77
class ActivityCard extends StatelessWidget {
88
final Activity activity;
@@ -11,8 +11,8 @@ class ActivityCard extends StatelessWidget {
1111

1212
@override
1313
Widget build(BuildContext context) {
14-
final user =
15-
DummyAppUser.values.firstWhere((it) => it.id == activity.actor);
14+
final user = appUsers
15+
.firstWhere((it) => createUserReference(it.id) == activity.actor);
1616
return Padding(
1717
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8),
1818
child: Column(
@@ -21,15 +21,15 @@ class ActivityCard extends StatelessWidget {
2121
Row(
2222
children: [
2323
CircleAvatar(
24-
child: Text(user.name![0]),
24+
child: Text(user.name[0]),
2525
),
2626
SizedBox(width: 16),
2727
Expanded(
2828
child: Column(
2929
crossAxisAlignment: CrossAxisAlignment.start,
3030
children: [
3131
Text(
32-
user.name!,
32+
user.name,
3333
style: TextStyle(
3434
fontSize: 18,
3535
),

example/lib/app_user.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class AppUser {
2+
final String id;
3+
final String name;
4+
final String token;
5+
6+
const AppUser.sahil()
7+
: id = 'sahil-kumar',
8+
name = 'Sahil Kumar',
9+
token =
10+
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoic2FoaWwta3VtYXIifQ.d6RW5eZedEl949w-IeZ40Ukji3yXfFnMw3baLsow028';
11+
12+
const AppUser.sacha()
13+
: id = 'sacha-arbonel',
14+
name = 'Sacha Arbonel',
15+
token =
16+
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoic2FjaGEtYXJib25lbCJ9.fzDKEyiQ40J4YYgtZxpeQhn6ajX-GEnKZOOmcb-xa7M';
17+
18+
const AppUser.nash()
19+
: id = 'neevash-ramdial',
20+
name = 'Neevash Ramdial',
21+
token =
22+
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoibmVldmFzaC1yYW1kaWFsIn0.yKqSehu_O5WJGh3-aa5qipnBRs7Qtue-1T9TZhT2ejw';
23+
24+
Map<String, Object> get data {
25+
final parts = name.split(' ');
26+
return {
27+
'first_name': parts[0],
28+
'last_name': parts[1],
29+
'full_name': name,
30+
};
31+
}
32+
}
33+
34+
const appUsers = [
35+
AppUser.sahil(),
36+
AppUser.sacha(),
37+
AppUser.nash(),
38+
];
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/material.dart';
12
import 'package:flutter/widgets.dart';
23
import 'package:stream_feed/stream_feed.dart';
34

@@ -10,16 +11,14 @@ class ClientProvider extends InheritedWidget {
1011

1112
final StreamFeedClient client;
1213

13-
static ClientProvider? of(BuildContext context) {
14-
return context.dependOnInheritedWidgetOfExactType<ClientProvider>();
14+
static ClientProvider of(BuildContext context) {
15+
final client = context.dependOnInheritedWidgetOfExactType<ClientProvider>();
16+
assert(client != null, 'Client not found in the widget tree');
17+
return client!;
1518
}
1619

1720
@override
1821
bool updateShouldNotify(ClientProvider old) {
1922
return old.child != child || old.client != client;
2023
}
2124
}
22-
23-
extension ProviderX on BuildContext {
24-
StreamFeedClient get client => ClientProvider.of(this)!.client;
25-
}

example/lib/dummy_app_user.dart

Lines changed: 0 additions & 41 deletions
This file was deleted.

example/lib/extension.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:stream_feed/stream_feed.dart';
3+
4+
import 'client_provider.dart';
5+
6+
extension ProviderX on BuildContext {
7+
StreamFeedClient get client => ClientProvider.of(this).client;
8+
}
9+
10+
extension Snackbar on BuildContext {
11+
void showSnackBar(final String message) {
12+
ScaffoldMessenger.of(this).showSnackBar(SnackBar(content: Text(message)));
13+
}
14+
}

example/lib/home.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import 'package:flutter/material.dart';
55
import 'package:stream_feed/stream_feed.dart';
66

77
class HomeScreen extends StatefulWidget {
8-
final User streamUser;
8+
final StreamUser currentUser;
99

10-
const HomeScreen({Key? key, required this.streamUser}) : super(key: key);
10+
const HomeScreen({Key? key, required this.currentUser}) : super(key: key);
1111

1212
@override
1313
_HomeScreenState createState() => _HomeScreenState();
@@ -31,9 +31,9 @@ class _HomeScreenState extends State<HomeScreen> {
3131
body: IndexedStack(
3232
index: _currentIndex,
3333
children: [
34-
TimelineScreen(streamUser: widget.streamUser),
35-
ProfileScreen(streamUser: widget.streamUser),
36-
PeopleScreen(streamUser: widget.streamUser),
34+
TimelineScreen(currentUser: widget.currentUser),
35+
ProfileScreen(currentUser: widget.currentUser),
36+
PeopleScreen(currentUser: widget.currentUser),
3737
],
3838
),
3939
bottomNavigationBar: BottomNavigationBar(

example/lib/main.dart

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
import 'package:example/dummy_app_user.dart';
2-
import 'package:example/utils/utils.dart';
1+
import 'package:example/app_user.dart';
2+
import 'package:example/client_provider.dart';
3+
import 'package:example/extension.dart';
34
import 'package:flutter/material.dart';
45
import 'package:stream_feed/stream_feed.dart';
56

7+
import 'client_provider.dart';
68
import 'home.dart';
79

810
void main() {
911
WidgetsFlutterBinding.ensureInitialized();
1012
final _key = String.fromEnvironment('key');
1113
final _user_token = String.fromEnvironment('user_token');
14+
1215
final client = StreamFeedClient.connect(_key, token: Token(_user_token));
1316
runApp(
1417
MyApp(
@@ -60,7 +63,7 @@ class _LoginScreenState extends State<LoginScreen> {
6063
),
6164
),
6265
SizedBox(height: 42),
63-
for (final user in DummyAppUser.values)
66+
for (final user in appUsers)
6467
Padding(
6568
padding: const EdgeInsets.all(8.0),
6669
child: RaisedButton(
@@ -70,8 +73,8 @@ class _LoginScreenState extends State<LoginScreen> {
7073
content: Text('Loading User'),
7174
),
7275
);
73-
final streamUser = await _client.user(user.id!).create(
74-
user.data!,
76+
final streamUser = await _client.user(user.id).create(
77+
user.data,
7578
getOrCreate: true,
7679
);
7780
ScaffoldMessenger.of(context).showSnackBar(
@@ -82,7 +85,7 @@ class _LoginScreenState extends State<LoginScreen> {
8285
Navigator.of(context).pushReplacement(
8386
MaterialPageRoute(
8487
builder: (_) => HomeScreen(
85-
streamUser: streamUser,
88+
currentUser: streamUser,
8689
),
8790
),
8891
);
@@ -99,7 +102,7 @@ class _LoginScreenState extends State<LoginScreen> {
99102
mainAxisAlignment: MainAxisAlignment.spaceBetween,
100103
children: [
101104
Text(
102-
user.name!,
105+
user.name,
103106
style: TextStyle(
104107
fontSize: 24,
105108
color: Colors.blue,

example/lib/people_screen.dart

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import 'package:example/dummy_app_user.dart';
2-
import 'package:example/utils/utils.dart';
31
import 'package:flutter/cupertino.dart';
42
import 'package:flutter/material.dart';
53
import 'package:stream_feed/stream_feed.dart';
4+
import 'app_user.dart';
5+
import 'extension.dart';
66

77
class PeopleScreen extends StatefulWidget {
8-
final User streamUser;
8+
final StreamUser currentUser;
99

10-
const PeopleScreen({Key? key, required this.streamUser}) : super(key: key);
10+
const PeopleScreen({Key? key, required this.currentUser}) : super(key: key);
1111

1212
@override
1313
_PeopleScreenState createState() => _PeopleScreenState();
@@ -16,8 +16,8 @@ class PeopleScreen extends StatefulWidget {
1616
class _PeopleScreenState extends State<PeopleScreen> {
1717
@override
1818
Widget build(BuildContext context) {
19-
final users = List<DummyAppUser>.from(DummyAppUser.values)
20-
..removeWhere((it) => it.id == widget.streamUser.id);
19+
final users = List.from(appUsers)
20+
..removeWhere((it) => it.id == widget.currentUser.id);
2121
final _client = context.client;
2222

2323
final followDialog = CupertinoAlertDialog(
@@ -50,29 +50,22 @@ class _PeopleScreenState extends State<PeopleScreen> {
5050
builder: (_) => followDialog,
5151
);
5252
if (result != null) {
53-
ScaffoldMessenger.of(context).showSnackBar(
54-
SnackBar(
55-
content: Text('Following User...'),
56-
),
57-
);
53+
context.showSnackBar('Following User...');
5854

5955
final currentUserFeed =
60-
_client.flatFeed('timeline', widget.streamUser.id!);
61-
final selectedUserFeed = _client.flatFeed('user', user.id!);
56+
_client.flatFeed('timeline', widget.currentUser.id);
57+
final selectedUserFeed = _client.flatFeed('user', user.id);
6258
await currentUserFeed.follow(selectedUserFeed);
63-
ScaffoldMessenger.of(context).showSnackBar(
64-
SnackBar(
65-
content: Text('Followed User'),
66-
),
67-
);
59+
60+
context.showSnackBar('Followed User');
6861
}
6962
},
7063
child: ListTile(
7164
leading: CircleAvatar(
72-
child: Text(user.name![0]),
65+
child: Text(user.name[0]),
7366
),
7467
title: Text(
75-
user.name!,
68+
user.name,
7669
style: TextStyle(
7770
fontSize: 24,
7871
fontWeight: FontWeight.w300,

example/lib/profile_screen.dart

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import 'package:example/utils/utils.dart';
1+
import 'extension.dart';
22
import 'package:flutter/material.dart';
33
import 'package:stream_feed/stream_feed.dart';
44

@@ -8,9 +8,10 @@ import 'add_activity_dialog.dart';
88
class ProfileScreen extends StatefulWidget {
99
const ProfileScreen({
1010
Key? key,
11-
required this.streamUser,
11+
required this.currentUser,
1212
}) : super(key: key);
13-
final User streamUser;
13+
14+
final StreamUser currentUser;
1415

1516
@override
1617
_ProfileScreenState createState() => _ProfileScreenState();
@@ -25,7 +26,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
2526
Future<void> _loadActivities({bool pullToRefresh = false}) async {
2627
if (!pullToRefresh) setState(() => _isLoading = true);
2728

28-
final userFeed = _client.flatFeed('user', widget.streamUser.id!);
29+
final userFeed = _client.flatFeed('user', widget.currentUser.id);
2930
final data = await userFeed.getActivities();
3031
if (!pullToRefresh) _isLoading = false;
3132
setState(() => activities = data);
@@ -40,7 +41,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
4041

4142
@override
4243
Widget build(BuildContext context) {
43-
final user = widget.streamUser;
44+
final user = widget.currentUser;
4445
return Scaffold(
4546
floatingActionButton: FloatingActionButton(
4647
onPressed: () async {
@@ -49,28 +50,19 @@ class _ProfileScreenState extends State<ProfileScreen> {
4950
builder: (_) => AddActivityDialog(),
5051
);
5152
if (message != null) {
52-
ScaffoldMessenger.of(context).showSnackBar(
53-
SnackBar(
54-
content: Text('Posting Activity...'),
55-
),
56-
);
53+
context.showSnackBar('Posting Activity...');
5754

5855
final activity = Activity(
59-
actor: user.id,
56+
actor: user.ref,
6057
verb: 'tweet',
6158
object: '1',
62-
extraData: {
63-
'tweet': message,
64-
},
59+
extraData: {'tweet': message},
6560
);
66-
final userFeed = _client.flatFeed('user', user.id!);
61+
62+
final userFeed = _client.flatFeed('timeline', user.id);
6763
await userFeed.addActivity(activity);
6864

69-
ScaffoldMessenger.of(context).showSnackBar(
70-
SnackBar(
71-
content: Text('Activity Posted...'),
72-
),
73-
);
65+
context.showSnackBar('Activity Posted...');
7466
_loadActivities();
7567
}
7668
},

0 commit comments

Comments
 (0)