fix: always show trailing widgets

This commit is contained in:
Rongjian Zhang 2019-09-25 21:41:44 +08:00
parent 04f483aafe
commit 0fe8fc5982
5 changed files with 110 additions and 88 deletions

View File

@ -52,7 +52,7 @@ class _RefreshStatefulScaffoldState<T>
}
Widget get _trailing {
if (_payload == null || widget.trailingBuilder == null) return null;
if (widget.trailingBuilder == null) return null;
return widget.trailingBuilder(_payload);
}

View File

@ -175,8 +175,9 @@ class ObjectScreen extends StatelessWidget {
return Link(
child: Icon(Octicons.settings, size: 20),
material: false,
screenBuilder: (_) =>
CodeSettingsScreen(payload['text'], _language),
screenBuilder: payload == null
? null
: (_) => CodeSettingsScreen(payload['text'], _language),
);
default:
return null;

View File

@ -92,20 +92,27 @@ class OrganizationScreen extends StatelessWidget {
},
title: AppBarTitle('Organization'),
trailingBuilder: (payload) {
return ActionButton(title: 'Organization Actions', actions: [
MyAction(
text: 'Share',
onPress: () {
Share.share(payload['url']);
},
),
MyAction(
text: 'Open in Browser',
onPress: () {
launch(payload['url']);
},
),
]);
return ActionButton(
title: 'Organization Actions',
actions: [
MyAction(
text: 'Share',
onPress: () {
if (payload != null) {
Share.share(payload['url']);
}
},
),
MyAction(
text: 'Open in Browser',
onPress: () {
if (payload != null) {
launch(payload['url']);
}
},
),
],
);
},
bodyBuilder: (payload) {
return Column(

View File

@ -136,53 +136,61 @@ class RepositoryScreen extends StatelessWidget {
fetchReadme(context),
]),
trailingBuilder: (data) {
var payload = data[0];
return ActionButton(title: 'Repository Actions', actions: [
MyAction(
text: '@$owner',
onPress: () {
WidgetBuilder builder;
return ActionButton(
title: 'Repository Actions',
actions: [
MyAction(
text: '@$owner',
onPress: () {
if (data == null) return;
WidgetBuilder builder;
switch (payload['owner']['__typename']) {
case 'Organization':
builder = (_) => OrganizationScreen(owner);
break;
case 'User':
builder = (_) => UserScreen(owner);
break;
}
switch (data[0]['owner']['__typename']) {
case 'Organization':
builder = (_) => OrganizationScreen(owner);
break;
case 'User':
builder = (_) => UserScreen(owner);
break;
}
Provider.of<ThemeModel>(context).pushRoute(context, builder);
},
),
MyAction(
text: payload['viewerHasStarred'] ? 'Unstar' : 'Star',
onPress: () async {
if (payload['viewerHasStarred']) {
await Provider.of<SettingsModel>(context)
.deleteWithCredentials('/user/starred/$owner/$name');
payload['viewerHasStarred'] = false;
} else {
Provider.of<SettingsModel>(context)
.putWithCredentials('/user/starred/$owner/$name');
payload['viewerHasStarred'] = true;
}
},
),
// TODO: watch
MyAction(
text: 'Share',
onPress: () {
Share.share(payload['url']);
},
),
MyAction(
text: 'Open in Browser',
onPress: () {
launch(payload['url']);
},
),
]);
Provider.of<ThemeModel>(context).pushRoute(context, builder);
},
),
if (data != null)
MyAction(
text: data[0]['viewerHasStarred'] ? 'Unstar' : 'Star',
onPress: () async {
if (data[0]['viewerHasStarred']) {
await Provider.of<SettingsModel>(context)
.deleteWithCredentials('/user/starred/$owner/$name');
data[0]['viewerHasStarred'] = false;
} else {
Provider.of<SettingsModel>(context)
.putWithCredentials('/user/starred/$owner/$name');
data[0]['viewerHasStarred'] = true;
}
},
),
// TODO: watch
MyAction(
text: 'Share',
onPress: () {
if (data != null) {
Share.share(data[0]['url']);
}
},
),
MyAction(
text: 'Open in Browser',
onPress: () {
if (data != null) {
launch(data[0]['url']);
}
},
),
],
);
},
bodyBuilder: (data) {
var payload = data[0];

View File

@ -146,7 +146,6 @@ class UserScreen extends StatelessWidget {
},
title: AppBarTitle('User'),
trailingBuilder: (data) {
var payload = data[0];
if (isMe) {
return Link(
child: Icon(Icons.settings, size: 20),
@ -155,35 +154,42 @@ class UserScreen extends StatelessWidget {
fullscreenDialog: true,
);
} else {
return ActionButton(title: 'User Actions', actions: [
if (payload['viewerCanFollow'])
return ActionButton(
title: 'User Actions',
actions: [
if (data != null && data[0]['viewerCanFollow'])
MyAction(
text: data[0]['viewerIsFollowing'] ? 'Unfollow' : 'Follow',
onPress: () async {
if (data[0]['viewerIsFollowing']) {
await Provider.of<SettingsModel>(context)
.deleteWithCredentials('/user/following/$login');
data[0]['viewerIsFollowing'] = false;
} else {
Provider.of<SettingsModel>(context)
.putWithCredentials('/user/following/$login');
data[0]['viewerIsFollowing'] = true;
}
},
),
MyAction(
text: payload['viewerIsFollowing'] ? 'Unfollow' : 'Follow',
onPress: () async {
if (payload['viewerIsFollowing']) {
await Provider.of<SettingsModel>(context)
.deleteWithCredentials('/user/following/$login');
payload['viewerIsFollowing'] = false;
} else {
Provider.of<SettingsModel>(context)
.putWithCredentials('/user/following/$login');
payload['viewerIsFollowing'] = true;
text: 'Share',
onPress: () {
if (data[0] != null) {
Share.share(data[0]['url']);
}
},
),
MyAction(
text: 'Share',
onPress: () {
Share.share(payload['url']);
},
),
MyAction(
text: 'Open in Browser',
onPress: () {
launch(payload['url']);
},
),
]);
MyAction(
text: 'Open in Browser',
onPress: () {
if (data[0] != null) {
launch(data[0]['url']);
}
},
),
],
);
}
},
bodyBuilder: (data) {