From 3d88ed9c053b0b92c9def9fe7fd8289c69fb0c1c Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Wed, 16 Jan 2019 22:47:30 +0100 Subject: [PATCH] OnBoarding: Move cloning logic to parent widget There were a few cases when since we were calling an async function in initState, which would then call setState, we would get an exception. Also this way, the entire logic of the onboarding is in one place, and the individual screens are far far simpler. --- lib/screens/onboarding_git_clone.dart | 71 +++------------------------ lib/screens/onboarding_screens.dart | 59 ++++++++++++++++------ 2 files changed, 50 insertions(+), 80 deletions(-) diff --git a/lib/screens/onboarding_git_clone.dart b/lib/screens/onboarding_git_clone.dart index 1d23edb1..afc26180 100644 --- a/lib/screens/onboarding_git_clone.dart +++ b/lib/screens/onboarding_git_clone.dart @@ -1,73 +1,16 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'package:path/path.dart' as p; +class OnBoardingGitClone extends StatelessWidget { + final String errorMessage; -import 'package:journal/analytics.dart'; -import 'package:journal/state_container.dart'; -import 'package:journal/storage/git.dart'; - -class OnBoardingGitClone extends StatefulWidget { - final Function doneFunction; - - OnBoardingGitClone({@required this.doneFunction}); - - @override - OnBoardingGitCloneState createState() { - return new OnBoardingGitCloneState(); - } -} - -class OnBoardingGitCloneState extends State { - String errorMessage = ""; - - @override - void initState() { - super.initState(); - - // FIXME: This is throwing an exception! - _initStateAsync(); - } - - void _initStateAsync() async { - var pref = await SharedPreferences.getInstance(); - String sshCloneUrl = pref.getString("sshCloneUrl"); - - // Just in case it was half cloned because of an error - await _removeExistingClone(); - - String error = await gitClone(sshCloneUrl, "journal"); - if (error != null && error.isNotEmpty) { - setState(() { - getAnalytics().logEvent( - name: "onboarding_gitClone_error", - parameters: { - 'error': error, - }, - ); - errorMessage = error; - }); - } else { - this.widget.doneFunction(); - } - } - - Future _removeExistingClone() async { - var baseDir = await getNotesDir(); - var dotGitDir = new Directory(p.join(baseDir.path, ".git")); - bool exists = await dotGitDir.exists(); - if (exists) { - await baseDir.delete(recursive: true); - await baseDir.create(); - } - } + OnBoardingGitClone({ + this.errorMessage, + }); @override Widget build(BuildContext context) { var children = []; - if (this.errorMessage.isEmpty) { + if (this.errorMessage == null || this.errorMessage.isEmpty) { children = [ Padding( padding: const EdgeInsets.all(8.0), @@ -85,7 +28,7 @@ class OnBoardingGitCloneState extends State { ), ), ]; - } else if (this.errorMessage.isNotEmpty) { + } else { children = [ Padding( padding: const EdgeInsets.all(8.0), diff --git a/lib/screens/onboarding_screens.dart b/lib/screens/onboarding_screens.dart index ed7f7f52..788d0689 100644 --- a/lib/screens/onboarding_screens.dart +++ b/lib/screens/onboarding_screens.dart @@ -1,6 +1,7 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:path/path.dart' as p; @@ -32,6 +33,7 @@ class OnBoardingScreenState extends State { var _pageSshKeyDone = false; var _gitCloneUrl = ""; + String gitCloneErrorMessage = ""; var pageController = PageController(); final GlobalKey _scaffoldKey = new GlobalKey(); @@ -108,13 +110,10 @@ class OnBoardingScreenState extends State { curve: Curves.easeIn, ); - SharedPreferences.getInstance().then((SharedPreferences pref) { - // We aren't calling setState as this isn't being used for rendering - _gitCloneUrl = sshUrl; + // We aren't calling setState as this isn't being used for rendering + _gitCloneUrl = sshUrl; - pref.setString("sshCloneUrl", sshUrl); - this._generateSshKey(); - }); + this._generateSshKey(); getAnalytics().logEvent( name: "onboarding_git_url_enterred", @@ -131,6 +130,8 @@ class OnBoardingScreenState extends State { curve: Curves.easeIn, ); + _startGitClone(); + getAnalytics().logEvent( name: "onboarding_public_key_copied", parameters: {}, @@ -141,15 +142,7 @@ class OnBoardingScreenState extends State { } if ((pos == 4 && _createNewRepo) || pos == 3) { - return OnBoardingGitClone( - doneFunction: () { - getAnalytics().logEvent( - name: "onboarding_complete", - parameters: {}, - ); - this.widget.onBoardingCompletedFunction(); - }, - ); + return OnBoardingGitClone(errorMessage: gitCloneErrorMessage); } }, itemCount: pageCount, @@ -243,6 +236,40 @@ class OnBoardingScreenState extends State { print(stack.toString()); } } + + void _startGitClone() async { + // Just in case it was half cloned because of an error + await _removeExistingClone(); + + String error = await gitClone(_gitCloneUrl, "journal"); + if (error != null && error.isNotEmpty) { + setState(() { + getAnalytics().logEvent( + name: "onboarding_gitClone_error", + parameters: { + 'error': error, + }, + ); + gitCloneErrorMessage = error; + }); + } else { + getAnalytics().logEvent( + name: "onboarding_complete", + parameters: {}, + ); + this.widget.onBoardingCompletedFunction(); + } + } + + Future _removeExistingClone() async { + var baseDir = await getNotesDir(); + var dotGitDir = new Directory(p.join(baseDir.path, ".git")); + bool exists = await dotGitDir.exists(); + if (exists) { + await baseDir.delete(recursive: true); + await baseDir.create(); + } + } } class OnBoardingInitialChoice extends StatelessWidget {