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:
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.