Project Track – Taski, Commandy i zepsuta krew

Plan na ten tydzień był prosty. Podszkolić się z Commandów, dołożyć kolejną cegiełkę do funkcjonalności pod tytułem wyświetl zadania konkretnego projektu, więc trzeba było też ogarnąć nawigację pomiędzy stronami w Xamarinie. Brzmi całkiem przyjemnie. Jak wielkie było moje zdziwienie kiedy okazało się, że wszystkie plany trzeba zredefiniować.

Wszystko zaczęło się w poniedziałek (bo jakby inaczej). Odpalam sobie Visual Studio, chcę odpalić aplikację żeby dokładnie sobie przypomnieć co to ja robiłem ostatnio i… JEB! Sypie mi errorem.

I żeby nie było za wesoło Xamarin nie ma niestety w zwyczaju powiedzieć od razu o co mu chodzi. Nieeee. Xamarin powie, że coś mu się nie podoba i myśl dalej sam człowieku co sie wywaliło… No to chodzę, kombinuję i po kilku minutach jest:

No dobra ale co to właściwie znaczy?

Ustawiłem sobie jeszcze kilka breakpointów żeby zobaczyć dokąd udaje się aplikacji dojść i już za moment wszystko jest jasne.

Okazuje się, że z jakiegoś powodu nie może połączyć się z API i bardzo mu się to nie podoba. Ale właściwie dlaczego? Spróbowałem wpisać odpowiedni adres w przeglądarce i spokojnie dostaję zwrotkę taką jakiej oczekuję. Czyli jednak coś z apką.

Nagle mnie oświeciło. Skoro API normalnie działa to musi być problem z internetem w emulatorze. No i faktycznie. Jak spojrzałem na ekran Androida to nie pokazuje żadnego połączenia internetowego. Ehhhh tak to już chyba czasem jest jak w czasie developowania musimy polegać na jakiejś jeszcze jednej warstwie której do końca właściwie nie rozumiemy. W takim razie hop do googla i szukamy. Szczęście w nieszczęściu, że chyba nie jest to jakiś super niecodzienny błąd. To świetnie powinno dać się go łatwo wyeliminować. No to próbuję kolejnych sposobów.

A to mówią żeby zmienić profil sieci z publicznego na prywatny… Nie działa.

A to żeby odłączyć kabel jeżeli korzystamy z WiFi i połączenia Ethernet… Nie działa.

A to żeby dodać do manifestu aplikacji Androidowej pozwolenie na korzystanie z Internetu

<uses-permission android:name="android.permission.INTERNET" />

Nie działa.

No szlag by to trafił.

W końcu w chwili ostatecznego zwątpienia postanowiłem odpalić aplikację w innym emulatorze. Wersja Andka taka sama, jądro takie samo, tylko urządzenie (wszystkie mam predefiniowane) się zmieniło z 5 na 6 cali. Odpalam i BACH. Już widzę, że będzie dobrze. Na ekranie wyświetla się połączenie z WiFi i po odpaleniu aplikacji wszystko działa tak jak zawsze. Póki co w takim razie, żeby dalej czasu nie tracić tak będę działał. ALE! Drogi czytelniku jeżeli masz pomysł co to mogło się stać, spotkałeś się z czymś takim kiedyś i wiesz jak to naprawić to proszę podziel się tym w komentarzach, a na pewno pomożesz mi i komuś kto być może trafi tutaj kiedyś z podobnym problemem.

Problem na pewien czas zażegnany można się brać za konkrety.

Command

Na dobry początek prac w tym tygodniu postanowiłem poświęcić trochę czasu na ogarnięcie jak się właściwie korzysta z Commandów. Już dwa wpisy temu dotyczące projektu dostałem wskazówkę co robię źle i co powinienem poprawić. No to trochę poczytałem, pokombinowałem i chyba w końcu zaczynam to czuć. W związku z tym przyszła pora na wyświetlenie zadań dla danego projektu. Szybko spojrzałem jak można podpiąć command pod ListView i wyszło mi coś takiego:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="ProjectTrack.ProjectPage" Title="Projekty">
    <ListView SelectedItem="{Binding SelectedProject, Mode=TwoWay}" ItemsSource="{Binding Projects.Result}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextCell Text="{Binding Name}" Detail="{Binding Count}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>
private readonly INavigationService _navigationService;
        private NozbeService nozbeService;
        private Project _selectedProject;
        public Project SelectedProject {
            get { return _selectedProject; }
            set
            {
                _selectedProject = value;

                if (_selectedProject == null)
                    return;

                ShowTasksCommand.Execute(_selectedProject.Id);

                SelectedProject = null;
            }
        }
        public NotifyTaskCompletion<List<Project>> Projects { get; private set; }

        public NotifyTaskCompletion<List<NozbeTask>> Tasks { get; private set; }

        public ICommand ShowTasksCommand { get; private set; }

        public ProjectViewModel(INavigationService navigationService)
        {

            nozbeService = new NozbeService("xxx@gmail.com", "xxx");

            Projects = new NotifyTaskCompletion<List<Project>>(GetProjects());
            if (navigationService == null) throw new ArgumentNullException("navigationService");
            _navigationService = navigationService;

            ShowTasksCommand = new Command<string>(ShowTasks);

        }

        public async Task<List<Project>> GetProjects()
        {
            var projects = await nozbeService.Projects();
            return JsonConvert.DeserializeObject<List<Project>>(projects);
        }

        void ShowTasks(string Id)
        {
            _navigationService.NavigateTo(ViewModelLocator.TaskPage, Id);
        }

Jak widać przy okazji postanowiłem jednak przerobić kod serwisu łączącego się z Nozbe na asynchroniczny.

Taski

A to w ogóle była moja kolejna kula u nogi. Nigdy nie umiałem pisać metod/klas/aplikacji asynchronicznych. Okazuje się, że przynajmniej w Xamarinie i do tego jak się dorobi jedną małą klasę NotifyTaskCompletion jest to całkiem proste. Dobrze, że tak szybko to się udało ogarnąć, bo znając siebie jakbym to odłożył na później to nigdy bym tego nie zrobił 🙂

No i tym sposobem doszedłem do końca kolejnego tygodnia prac. Aplikacja bardzo powolutku zaczyna nabierać kształtów, a to czego się już do tej pory nauczyłem jest naprawdę mega.

Na przyszły tydzień zaplanowane są dwa zadania. Jedno to podpiąć jakąś lokalną bazę żeby trzymać info o czasie na telefonie, a także aktualizowanie tasków w Nozbe. Trzymajcie kciuki za powodzenie 🙂

Related posts