Visual Basic no Xamarin Android e iOS

O aplicativo de exemplo demonstra como o código do Visual Basic compilado em uma biblioteca do .NET Standard pode ser usado com o Xamarin. Aqui estão algumas capturas de tela dos aplicativos resultantes em execução no Android e iOS:

Android e iOS executando um aplicativo criado com o Visual Basic

Os projetos Android e iOS no exemplo são todos escritos em C#. A interface do usuário para cada aplicativo é criada com tecnologias nativas, enquanto o TodoItem gerenciamento é fornecido pela biblioteca do Visual Basic .NET Standard usando um arquivo XML (para fins de demonstração, não um banco de dados completo).

Passo a passo de exemplo

Este guia discute como o Visual Basic foi implementado no exemplo TaskyVB Xamarin para iOS e Android.

Observação

Revise as instruções no Visual Basic e .NET Standard antes de continuar com este guia.

Consulte o Xamarin.Forms usando instruções do Visual Basic para ver como criar um aplicativo com código compartilhado da interface do usuário do Visual Basic.

VisualBasicNetStandard

As bibliotecas do Visual Basic .NET Standard só podem ser criadas no Visual Studio no Windows. A biblioteca de exemplo contém as noções básicas de nosso aplicativo nesses arquivos do Visual Basic:

  • TodoItem.vb
  • TodoItemManager.vb
  • TodoItemRepositoryXML.vb
  • XmlStorage.vb

TodoItem.vb

Essa classe contém o objeto de negócios a ser usado em todo o aplicativo. Ele será definido em Visual Basic e compartilhado com os projetos Android e iOS que são escritos em C#.

A definição de classe é mostrada aqui:

Public Class TodoItem
    Property ID() As Integer
    Property Name() As String
    Property Notes() As String
    Property Done() As Boolean
End Class

O exemplo usa serialização XML e desserialização para carregar e salvar os objetos TodoItem.

TodoItemManager.vb

A classe Manager apresenta a 'API' para o código portátil. Ele fornece operações CRUD básicas para a TodoItem classe, mas nenhuma implementação dessas operações.

Public Class TodoItemManager
    Private _repository As TodoItemRepositoryXML
    Public Sub New(filename As String)
        _repository = New TodoItemRepositoryXML(filename, storage)
    End Sub
    Public Function GetTask(id As Integer) As TodoItem
        Return _repository.GetTask(id)
    End Function
    Public Function GetTasks() As List(Of TodoItem)
        Return New List(Of TodoItem)(_repository.GetTasks())
    End Function
    Public Function SaveTask(item As TodoItem) As Integer
        Return _repository.SaveTask(item)
    End Function
    Public Function DeleteTask(item As TodoItem) As Integer
        Return _repository.DeleteTask(item.ID)
    End Function
End Class

O construtor usa uma instância de IXmlStorage como um parâmetro. Isso permite que cada plataforma forneça sua própria implementação de trabalho, enquanto ainda permite que o código portátil descreva outras funcionalidades que podem ser compartilhadas.

TodoItemRepository.vb

A classe repository contém a lógica para gerenciar a lista de objetos TodoItem. O código completo é mostrado abaixo – a lógica existe principalmente para gerenciar um valor de ID exclusivo em todos os TodoItems à medida que eles são adicionados e removidos da coleção.

Public Class TodoItemRepositoryXML
    Private _filename As String
    Private _storage As IXmlStorage
    Private _tasks As List(Of TodoItem)

    ''' <summary>Constructor</summary>
    Public Sub New(filename As String)
        _filename = filename
        _storage = New XmlStorage
        _tasks = _storage.ReadXml(filename)
    End Sub
    ''' <summary>Inefficient search for a Task by ID</summary>
    Public Function GetTask(id As Integer) As TodoItem
        For t As Integer = 0 To _tasks.Count - 1
            If _tasks(t).ID = id Then
                Return _tasks(t)
            End If
        Next
        Return New TodoItem() With {.ID = id}
    End Function
    ''' <summary>List all the Tasks</summary>
    Public Function GetTasks() As IEnumerable(Of TodoItem)
        Return _tasks
    End Function
    ''' <summary>Save a Task to the Xml file
    ''' Calculates the ID as the max of existing IDs</summary>
    Public Function SaveTask(item As TodoItem) As Integer
        Dim max As Integer = 0
        If _tasks.Count > 0 Then
            max = _tasks.Max(Function(t As TodoItem) t.ID)
        End If
        If item.ID = 0 Then
            item.ID = ++max
            _tasks.Add(item)
        Else
            Dim j = _tasks.Where(Function(t) t.ID = item.ID).First()
            j = item
        End If
        _storage.WriteXml(_tasks, _filename)
        Return max
    End Function
    ''' <summary>Removes the task from the XMl file</summary>
    Public Function DeleteTask(id As Integer) As Integer
        For t As Integer = 0 To _tasks.Count - 1
            If _tasks(t).ID = id Then
                _tasks.RemoveAt(t)
                _storage.WriteXml(_tasks, _filename)
                Return 1
            End If
        Next
        Return -1
    End Function
End Class

Observação

Este código é um exemplo de um mecanismo de armazenamento de dados muito básico. Ele é fornecido para demonstrar como uma biblioteca do .NET Standard pode codificar em uma interface para acessar a funcionalidade específica da plataforma (neste caso, carregando e salvando um arquivo XML). Não pretendia ser uma alternativa de base de dados de qualidade de produção.

Projetos de aplicativos Android e iOS

iOS

No aplicativo iOS, o TodoItemManager e o XmlStorageImplementation são criados no arquivo AppDelegate.cs , conforme mostrado neste trecho de código. As quatro primeiras linhas estão apenas construindo o caminho para o arquivo onde os dados serão armazenados; As duas linhas finais mostram as duas classes sendo instanciadas.

var xmlFilename = "TodoList.xml";
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); // Documents folder
string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder
var path = Path.Combine(libraryPath, xmlFilename);

TaskMgr = new TodoItemManager(path);

Android

No aplicativo Android, o TodoItemManager e o XmlStorageImplementation são criados no arquivo Application.cs , conforme mostrado neste trecho de código. As três primeiras linhas estão apenas construindo o caminho para o arquivo onde os dados serão armazenados; As duas linhas finais mostram as duas classes sendo instanciadas.

var xmlFilename = "TodoList.xml";
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var path = Path.Combine(libraryPath, xmlFilename);

TaskMgr = new TodoItemManager(path);

O restante do código do aplicativo se preocupa principalmente com a interface do usuário e com o uso da TaskMgr classe para carregar e salvar TodoItem classes.

Visual Studio 2019 para Mac

Aviso

Visual Studio para Mac NÃO oferece suporte à edição da linguagem Visual Basic – não há itens de menu para criar projetos ou arquivos do Visual Basic. Se você abrir um .vb não haverá realce de sintaxe de linguagem, preenchimento automático ou IntelliSense.

O Visual Studio 2019 para Mac pode compilar projetos do Visual Studio .NET Standard criados no Windows, para que os aplicativos iOS possam fazer referência a esses projetos.

Visual Studio 2017 não pode criar projetos do Visual Basic em tudo.

Resumo

Este artigo demonstrou como consumir código do Visual Basic em aplicativos Xamarin usando bibliotecas do Visual Studio e .NET Standard. Mesmo que o Xamarin não ofereça suporte ao Visual Basic diretamente, compilar o Visual Basic em uma biblioteca do .NET Standard permite que o código escrito com o Visual Basic seja incluído em aplicativos iOS e Android.