Skip to content

Commit

Permalink
refactor(frontend): Use TaggerPage to fix GetView issues
Browse files Browse the repository at this point in the history
* This assures we don't end up without a controller instance (get loses it somehow)
* Also added theme persistence
  • Loading branch information
Grohden committed Aug 5, 2020
1 parent b1de0ce commit f0f5672
Show file tree
Hide file tree
Showing 16 changed files with 104 additions and 75 deletions.
15 changes: 10 additions & 5 deletions frontend/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:repo_tagger/tagger_preferences.dart';

import 'api/tagger/repository_tagger_client.dart';
import 'router.dart';
Expand Down Expand Up @@ -83,11 +84,19 @@ class TaggerApp extends StatelessWidget {
final Dio dio;
final RepositoryTaggerClient taggerClient;

void _initSetup() async {
await taggerPreferences.init();
final mode = taggerPreferences.themeMode();

Get.changeThemeMode(mode);
}

@override
Widget build(BuildContext context) {
_initSetup();

return GetMaterialApp(
title: 'Repo Tagger',
themeMode: ThemeMode.dark,
theme: ThemeData.light().copyWith(
primaryColor: Colors.blue,
),
Expand All @@ -96,7 +105,6 @@ class TaggerApp extends StatelessWidget {
accentColor: Colors.lightBlueAccent,
),
initialRoute: Routes.splash,
navigatorKey: Get.key,
getPages: [
GetPage(
name: Routes.splash,
Expand All @@ -105,17 +113,14 @@ class TaggerApp extends StatelessWidget {
GetPage(
name: Routes.home,
page: () => HomePage(),
binding: HomeBinding(),
),
GetPage(
name: Routes.repoDetails,
page: () => RepositoryDetailsPage(),
binding: RepositoryDetailsBinding(),
),
GetPage(
name: Routes.tagRepositories,
page: () => TagRepositoriesPage(),
binding: TagRepositoriesBinding(),
),
GetPage(
name: Routes.login,
Expand Down
45 changes: 45 additions & 0 deletions frontend/lib/tagger_preferences.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

const _themeModePref = 'THEME_MODE';

final taggerPreferences = _TaggerPreferences();

class _TaggerPreferences {
SharedPreferences _sharedInstance;

Future init() async {
_sharedInstance = await SharedPreferences.getInstance();
}

ThemeMode themeMode() {
final mode = _sharedInstance.getString(_themeModePref);

if (mode == 'dark') {
return ThemeMode.dark;
}

if (mode == 'light') {
return ThemeMode.light;
}

return ThemeMode.system;
}

Future setThemeMode(ThemeMode mode) async {
String modeString;
switch (mode) {
case ThemeMode.system:
modeString = 'system';
break;
case ThemeMode.light:
modeString = 'light';
break;
case ThemeMode.dark:
modeString = 'dark';
break;
}

await _sharedInstance.setString(_themeModePref, modeString);
}
}
11 changes: 0 additions & 11 deletions frontend/lib/ui/pages/home/home_bindings.dart

This file was deleted.

9 changes: 6 additions & 3 deletions frontend/lib/ui/pages/home/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';

import '../../templates/three_slot_container.dart';
import '../../utils/tagger_page.dart';
import '../starred/starred_page.dart';
import '../tags/tags_page.dart';
import 'widgets/sidebar.dart';
import 'widgets/sidebar_button.dart';

part 'home_bindings.dart';

part 'home_controller.dart';

class HomePage extends GetView<HomeController> {
class HomePage extends TaggerPage<HomeController> {

@override
HomeController provider() => HomeController();

@override
Widget build(BuildContext context) {
return GetX(
Expand Down
5 changes: 4 additions & 1 deletion frontend/lib/ui/pages/home/widgets/sidebar.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:repo_tagger/tagger_preferences.dart';

/// Side bar showed on home route
/// it shows the given [content] and a logout button
Expand Down Expand Up @@ -38,10 +39,12 @@ class Sidebar extends StatelessWidget {
title: const Text('Dark theme'),
value: Get.isDarkMode,
onChanged: (active) {
final mode = active ? ThemeMode.dark : ThemeMode.light;
// Theme changing is good, but this is what makes us
// see that flutter is not really ready for web, as changing
// theme modes causes the page to hang a little
Get.changeThemeMode(active ? ThemeMode.dark : ThemeMode.light);
Get.changeThemeMode(mode);
taggerPreferences.setThemeMode(mode);
},
);
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,16 @@ import '../../../router.dart';
import '../../molecules/detail_chip.dart';
import '../../molecules/load_page_error.dart';
import '../../utils/browser.dart';
import '../../utils/tagger_page.dart';
import 'widgets/readme_container.dart';
import 'widgets/tags_container.dart';

part 'repository_details_bindings.dart';

part 'repository_details_controller.dart';

class RepositoryDetailsPage extends GetView<RepositoryDetailsController> {
class RepositoryDetailsPage extends TaggerPage<RepositoryDetailsController> {
@override
RepositoryDetailsController provider() => RepositoryDetailsController();

@override
Widget build(BuildContext context) {
return GetX(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import 'package:markdown/markdown.dart' as md;
import '../repository_details_page.dart';

/// Controls exhibition of the repository readme
/// [RepositoryDetailsController] is required to be injected.
class ReadmeContainer extends GetView<RepositoryDetailsController> {
class ReadmeContainer extends StatelessWidget {
@override
Widget build(BuildContext context) {
final controller = Get.find<RepositoryDetailsController>();
final repo = controller.repository.value;
final readmeContents = repo.readmeContents;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:repo_tagger/ui/utils/tagger_page.dart';

import '../../../../api/tagger/repository_tagger_client.dart';
import '../../../../external/taggable/taggable.dart';
import '../repository_details_page.dart';

/// Controls exhibition and creation UI for user tags
/// [RepositoryDetailsController] is required to be injected.
class TagsContainer extends GetView<RepositoryDetailsController> {
class TagsContainer extends TaggerPage<RepositoryDetailsController> {
@override
RepositoryDetailsController provider() => RepositoryDetailsController();

@override
Widget build(BuildContext context) {
// FIXME: underlying third party lib is applying a really
Expand Down
9 changes: 0 additions & 9 deletions frontend/lib/ui/pages/starred/starred_bindings.dart

This file was deleted.

8 changes: 5 additions & 3 deletions frontend/lib/ui/pages/starred/starred_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ import '../../../router.dart';
import '../../molecules/load_page_error.dart';
import '../../molecules/page_title.dart';
import '../../templates/repository_list.dart';

part 'starred_bindings.dart';
import '../../utils/tagger_page.dart';

part 'starred_controller.dart';

class StarredPage extends GetView<StarredController> {
class StarredPage extends TaggerPage<StarredController> {
@override
StarredController provider() => StarredController();

@override
Widget build(BuildContext context) {
return GetX(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:repo_tagger/ui/utils/tagger_page.dart';

import '../../../api/tagger/repository_tagger_client.dart';
import '../../../router.dart';
import '../../molecules/load_page_error.dart';
import '../../molecules/page_title.dart';
import '../../templates/repository_list.dart';

part 'tag_repositories_bindings.dart';

part 'tag_repositories_controller.dart';

class TagRepositoriesPage extends GetView<TagRepositoriesController> {
class TagRepositoriesPage extends TaggerPage<TagRepositoriesController> {
@override
TagRepositoriesController provider() => TagRepositoriesController();

@override
Widget build(BuildContext context) {
return GetX(
Expand Down
9 changes: 0 additions & 9 deletions frontend/lib/ui/pages/tags/tags_bindings.dart

This file was deleted.

8 changes: 5 additions & 3 deletions frontend/lib/ui/pages/tags/tags_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import '../../../api/tagger/repository_tagger_client.dart';
import '../../../router.dart';
import '../../molecules/load_page_error.dart';
import '../../molecules/page_title.dart';

part 'tags_bindings.dart';
import '../../utils/tagger_page.dart';

part 'tags_controller.dart';

class TagsPage extends GetView<TagsController> {
class TagsPage extends TaggerPage<TagsController> {
@override
TagsController provider() => TagsController();

@override
Widget build(BuildContext context) {
return GetX(
Expand Down
12 changes: 12 additions & 0 deletions frontend/lib/ui/utils/tagger_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';

/// Similar to GetView but this one forces a controller instance to be present
/// (get loses itself sometimes)
abstract class TaggerPage<T> extends StatelessWidget {
const TaggerPage({Key key}) : super(key: key);

T provider();

T get controller => Get.put<T>(provider());
}

0 comments on commit f0f5672

Please sign in to comment.