.NET MAUI Preview 12 Yenilikleri

Merhabalar,

Preview 12 ile beraber yeni iyileştirmeler ve yeni özellikler geldi. Fakat Preview 12’yi genel olarak bir iyileştirme güncellemesi olarak görüyoruz. Bunların yanında dökümantasyon tarafında da güzel gelişmeler var.

App icons, App lifecycle, Brushes, Controls ve Single Project konuları .NET MAUI dökümanlarına eklendi.

https://docs.microsoft.com/tr-tr/dotnet/maui/
  • Android tarafına FlyoutView handler implementasyonu yapıldı.
  • RelativeLayout ve AbsoluteLayout tarafında iki kritik bug vardı bunlar fixlendi. #3006 ve #2062
  • IView interfaceine Zindex özelliği eklendi.
  • Daha önce de bahsettiğim native iOS typeları nint ve nuint .NET 6 tarafına eklendi.
  • Windows extended toolbar geldi.

Preview 12’de en büyük güncelleme Shell tarafına geldi. Shell yapısını genel olarak; Açılır menüleri, sekmeleri ve sayfa akışlarını yöneten bir navigation mimarisi olarak tanımlayabiliriz.

Shell yapısını kullanabilmek için uygulamalarınızın ana çatısını AppShell ilke oluşturmanız gerekmektedir. Kullanımı Xamarin.Forms Shell ile tamamen aynı.

<Shell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       xmlns:pages="clr-namespace:Microsoft.NetConf2021.Maui.Pages"
       xmlns:root="clr-namespace:Microsoft.NetConf2021.Maui"
       xmlns:viewmodels="clr-namespace:Microsoft.NetConf2021.Maui.ViewModels"
       x:DataType="viewmodels:ShellViewModel"
       x:Class="Microsoft.NetConf2021.Maui.Pages.MobileShell">
    <TabBar>
        <Tab Title="{Binding Discover.Title}"
             Icon="{Binding Discover.Icon}">
            <ShellContent ContentTemplate="{DataTemplate pages:DiscoverPage}" />
        </Tab>
        <Tab Title="{Binding Subscriptions.Title}"
             Icon="{Binding Subscriptions.Icon}">
            <ShellContent ContentTemplate="{DataTemplate pages:SubscriptionsPage}" />
        </Tab>
        <Tab Title="{Binding ListenLater.Title}"
             Icon="{Binding ListenLater.Icon}">
            <ShellContent ContentTemplate="{DataTemplate pages:ListenLaterPage}" />
        </Tab>
        <Tab Title="{Binding ListenTogether.Title}"
             Icon="{Binding ListenTogether.Icon}"
             IsVisible="{x:Static root:Config.ListenTogetherIsVisible}">
            <ShellContent 
                ContentTemplate="{DataTemplate pages:ListenTogetherPage}" />
        </Tab>
        <Tab Title="{Binding Settings.Title}"
             Icon="{Binding Settings.Icon}">
            <ShellContent ContentTemplate="{DataTemplate pages:SettingsPage}" />
        </Tab>
    </TabBar>
</Shell>

Geliştirilen .NET Podcasts – Sample Application kodlarından da gelen yenilikleri inceleyebilirsiniz.

Shell nagivation kullanarak geliştirdiğimiz uygulamalarımızda routing işlemlerini URI bazlı ilerletiyoruz. Bunu demo uygulamayı inceleyerek görebilirsiniz.

Routing.RegisterRoute(nameof(DiscoverPage), typeof(DiscoverPage));
Routing.RegisterRoute(nameof(ShowDetailPage), typeof(ShowDetailPage));
Routing.RegisterRoute(nameof(EpisodeDetailPage), typeof(EpisodeDetailPage));
Routing.RegisterRoute(nameof(CategoriesPage), typeof(CategoriesPage));
Routing.RegisterRoute(nameof(CategoryPage), typeof(CategoryPage));

Bu zamana kadar Shell kullanmadan NavigationService kullanarak geliştirme yapanlar için buraya kadar bahsettiklerimiz yeni bir yaklaşım olarak gelecektir fakat sayfa geçişleri NavigationService yaklaşımıyla aynı.

private Task NavigateToDetailCommandExecute()
{
    return Shell.Current.GoToAsync($"{nameof(ShowDetailPage)}?Id={Show.Id}");
}

Web geliştiren arkadaşlar için bu URI yapısı hiç yapancı gelmeyecektir. Web tarafında buna QueryString diyoruz fakat Shell tarafında QueryProperty olarak adlandırıyoruz.

 [QueryProperty(nameof(Id), nameof(Id))]
public class ShowDetailViewModel : BaseViewModel
{
    public string Id { get; set; }
}

.NET MAUI ile birlikte HostBuilder ile güçlü bir DependencyInjection yönetimi mevcut. Bunun eksikliğini Xamarin.Forms tarafında çok çekmiştik fakat .NET MAUI ile çok kolay ve basit kullımlı bir DependencyInjection yönetimi geldi.

public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>();

            builder.Services
                .AddSingleton<MainViewModel>();

            return builder.Build();
        }
    }
public partial class MainPage
{
    readonly MainViewModel _viewModel;

    public MainPage(MainViewModel viewModel)
    {
        InitializeComponent();

        BindingContext = _viewModel = viewModel;
    }
}

Xamarin.Forms tarafında 8 serilik bir katmanlı mimari serisini incelemek isterseniz : https://ozaksut.com/xamarin-forms-ile-katmansal-mimariye-giris-1/

Kaynak : https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-12/

Yiğit

Xamarin Developer, Consultant & Architect. Community Leader and Director of Xamarin Türkiye

Post A Reply