Skip to content

Conversation

@moljac
Copy link
Contributor

@moljac moljac commented Aug 3, 2021

Compose bindings (stable only)

new bindings for àndroidx.compose` artifacts

  • androidx.compose.animation:animation - -> 1.0.0

  • androidx.compose.animation:animation-core - -> 1.0.0

  • androidx.compose.foundation:foundation - -> 1.0.0

  • androidx.compose.foundation:foundation-layout - -> 1.0.0

  • androidx.compose.material:material - -> 1.0.0

  • androidx.compose.material:material-icons-core - -> 1.0.0

  • androidx.compose.material:material-icons-extended - -> 1.0.0

  • androidx.compose.material:material-ripple - -> 1.0.0

  • androidx.compose.runtime:runtime - -> 1.0.0

  • androidx.compose.runtime:runtime-livedata - -> 1.0.0

  • androidx.compose.runtime:runtime-rxjava2 - -> 1.0.0

  • androidx.compose.runtime:runtime-saveable - -> 1.0.0

  • androidx.compose.ui:ui - -> 1.0.0

  • androidx.compose.ui:ui-geometry - -> 1.0.0

  • androidx.compose.ui:ui-graphics - -> 1.0.0

  • androidx.compose.ui:ui-text - -> 1.0.0

  • androidx.compose.ui:ui-unit - -> 1.0.0

  • androidx.compose.ui:ui-util - -> 1.0.0

  • androidx.compose.ui:ui-viewbinding - -> 1.0.0

  • androidx.profileinstaller:profile-installer - -> 1.0.0

Checklist

  • Add any metadata needed to get PR to compile
  • Verify any new namespaces are properly renamed (utilities.cake)
  • Verify nuget/namespace spelling (utilities.cake)

@moljac moljac self-assigned this Aug 3, 2021
@moljac moljac added the do-not-merge PR is still in progress and is not ready to be merged label Aug 3, 2021
@4brunu
Copy link
Contributor

4brunu commented Aug 31, 2021

@moljac this would be awesome to have, is there anything left to do before merging and publish to nuget?
Thanks

@moljac
Copy link
Contributor Author

moljac commented Sep 2, 2021

@moljac this would be awesome to have, is there anything left to do before merging and publish to nuget?
Thanks

yes I know it would be awsome to have, but my timeslots are getting smaller and smaller and these artifacts are darn tough to bind.

Soon I hope. Sincerely

@moljac
Copy link
Contributor Author

moljac commented Oct 5, 2021

@4brunu

bound!

How do you plan to use it? Can you provide a sample?

@4brunu
Copy link
Contributor

4brunu commented Oct 5, 2021

Hi @moljac,
My use case is, I develop a native Android library that uses jetpack compose, and our library is used in Xamarin apps, so we need to reference those bindings, when creating a binding for our native Android library, because it's a runtime dependency, but I don't need to use those bindings directly in Xamarin.Android.
Do you wan't me to create a sample project?
Thanks for working on this.

@moljac
Copy link
Contributor Author

moljac commented Oct 5, 2021

Hi @moljac, My use case is, I develop a native Android library that uses jetpack compose, and our library is used in Xamarin apps, so we need to reference those bindings, when creating a binding for our native Android library, because it's a runtime dependency, but I don't need to use those bindings directly in Xamarin.Android.

OK. Thanks. I get it.

Do you wan't me to create a sample project?

It would be nice. I would add it to the samples folder, as a use case and for testing ACWs.

Thanks for working on this.

You re welcome. And sorry you had to wait.

@moljac moljac requested a review from jpobst October 5, 2021 15:27
@4brunu
Copy link
Contributor

4brunu commented Oct 5, 2021

It would be nice. I would add it to the samples folder, as a use case and for testing ACWs.

I will create it tomorrow and upload it here.

You re welcome. And sorry you had to wait.

No problem, take your take.

@jpobst
Copy link
Contributor

jpobst commented Oct 5, 2021

While I generally don't think we should provide samples due to resource constraints, I think in this case we should have something to ensure this works before we publish it. Once we publish this on NuGet, people are going to expect it to work, and we should at least know if it does or not.

There are 2 use cases:

  • The case mentioned above where Compose is used in a native library and only the .jar's are needed
  • The case where users want to build a UI using Compose in C# and managed bindings are needed

The first case is simple, and these bindings are in fact overkill for it. We do not need managed bindings, just a loose .jar file and a .targets file that adds the .jar file to the users project as <EmbeddedJar>.

The second case is more interesting. My understanding from @jonathanpeppers is that it requires Java compile time dynamic source generation, which we do not support. So this case may not work for Xamarin.

I think we need to determine if this second case works or not. If not, I think we should only provide the .jar files in NuGets and not managed bindings.

@4brunu
Copy link
Contributor

4brunu commented Oct 6, 2021

Hi, here is the sample project, that consists in a native jetpack compose library, a native app to try the native jetpack compose library and a Xamarin binding to try the native jetpack compose library.

SampleJetpackCompose.zip

NOTE: In the sample project, currently the jetpack compose library and the native app are working, but the Xamarin binding is not working, because the dependencies the jetpack dependencies are missing in MyApp2/MyLib/MyLib.csproj.

    <PackageReference Include="Xamarin.AndroidX.Compose.UI.UI" Version="1.0.0" />
    <!-- TODO: missing dependency -->
    <PackageReference Include="Xamarin.AndroidX.Compose.UI.UI.Tooling" Version="1.0.0" />
    <PackageReference Include="Xamarin.AndroidX.Compose.Foundation.Foundation" Version="1.0.0" />
    <PackageReference Include="Xamarin.AndroidX.Compose.Compose.Material.Material" Version="1.0.0" />
    <PackageReference Include="Xamarin.AndroidX.Compose.Compose.Material.MaterialIcons.Core" Version="1.0.0" />
    <PackageReference Include="Xamarin.AndroidX.Compose.Compose.Material.Material.Icons.Extended" Version="1.0.0" />
    <!-- TODO: missing dependency -->
    <PackageReference Include="Xamarin.AndroidX.Activity.Activity.Compose" Version="1.3.1" />

Regarding this PR, the binding list is very solid to start, but I think there are three missing packages that are a must have in jetpack libraries

    implementation 'androidx.activity:activity-compose:1.3.1'
    implementation 'androidx.compose.ui:ui-tooling:1.0.0'
    implementation "com.google.android.material:compose-theme-adapter:1.0.0"

Regarding using jetpack compose to build UI in Xamarin, I think that it will not be possible.
AFAIK Jetpack compose can only be used in Kotlin to build UI's, it's not usable from Java, so I think it will not be usable also from C#, but I could be wrong.
https://stackoverflow.com/a/66433621/976628

@jonathanpeppers
Copy link
Member

Jetpack Compose makes heavy use of Kotlin features such as coroutines, and @Composable methods require transformations that are done by a Kotlin compiler plugin. There is no way to get access to these from Java.

It might be an interesting research project to see if this could possibly work from C#. I suspect it might involved porting their Kotlin compiler plugin to a C# source generator.

It might be hard to maintain this overtime, if they keep changing it for each Jetpack release.

@4brunu
Copy link
Contributor

4brunu commented Oct 11, 2021

Jetpack Compose it's in the very early days, each release it's coupled with a kotlin specific version, because the Kotlin Compiler Plugin API it's not stable, so I would advice to wait at least until the Kotlin Compiler Plugin API is stable, otherwise it will be a hard journey for Xamarin.
Right now being able to bind a Native Android Library that uses Jetpack Compose would be a great starting point.

@4brunu
Copy link
Contributor

4brunu commented Oct 24, 2021

Any news on this? What about merging this as is and them improve?

@moljac
Copy link
Contributor Author

moljac commented Oct 27, 2021

Jetpack Compose makes heavy use of Kotlin features such as coroutines, and @Composable methods require transformations that are done by a Kotlin compiler plugin. There is no way to get access to these from Java.

It might be an interesting research project to see if this could possibly work from C#. I suspect it might involved porting their Kotlin compiler plugin to a C# source generator.

I dream of getting some time off and dive into monadic parser combinators like Sprache or Superpower which would include parsing only methods decorated with Composableattribute (annotation in Kotlin) and parse body of the method which seem to be pretty simple (UI declaration).

It might be hard to maintain this overtime, if they keep changing it for each Jetpack release.

And this is another story.

@moljac
Copy link
Contributor Author

moljac commented Oct 27, 2021

I'm not really a fan of publishing them as-is. That feels like doing 2 bad things: publishing unusable bindings and a breaking change to remove them in a future release.

I have remove-node-ed all packages, so no C# (MCWs) will be generated.

@moljac
Copy link
Contributor Author

moljac commented Oct 27, 2021

No MCWs generated (only AssemblyInfo.cs and AssemblyAttributes.cs)

% find ./generated/androidx.compose.*/ -type f -name "*.cs"
./generated/androidx.compose.animation.animation-core//obj/Release/monoandroid9.0/androidx.compose.animation.animation-core.AssemblyInfo.cs
./generated/androidx.compose.animation.animation-core//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.animation.animation-core//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.animation.animation-core//obj/Release/net6.0-android/androidx.compose.animation.animation-core.AssemblyInfo.cs
./generated/androidx.compose.animation.animation//obj/Release/monoandroid9.0/androidx.compose.animation.animation.AssemblyInfo.cs
./generated/androidx.compose.animation.animation//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.animation.animation//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.animation.animation//obj/Release/net6.0-android/androidx.compose.animation.animation.AssemblyInfo.cs
./generated/androidx.compose.foundation.foundation-layout//obj/Release/monoandroid9.0/androidx.compose.foundation.foundation-layout.AssemblyInfo.cs
./generated/androidx.compose.foundation.foundation-layout//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.foundation.foundation-layout//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.foundation.foundation-layout//obj/Release/net6.0-android/androidx.compose.foundation.foundation-layout.AssemblyInfo.cs
./generated/androidx.compose.foundation.foundation//obj/Release/monoandroid9.0/androidx.compose.foundation.foundation.AssemblyInfo.cs
./generated/androidx.compose.foundation.foundation//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.foundation.foundation//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.foundation.foundation//obj/Release/net6.0-android/androidx.compose.foundation.foundation.AssemblyInfo.cs
./generated/androidx.compose.material.material-icons-core//obj/Release/monoandroid9.0/androidx.compose.material.material-icons-core.AssemblyInfo.cs
./generated/androidx.compose.material.material-icons-core//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material-icons-core//obj/Release/net6.0-android/androidx.compose.material.material-icons-core.AssemblyInfo.cs
./generated/androidx.compose.material.material-icons-core//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material-icons-extended//obj/Release/monoandroid9.0/androidx.compose.material.material-icons-extended.AssemblyInfo.cs
./generated/androidx.compose.material.material-icons-extended//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material-icons-extended//obj/Release/net6.0-android/androidx.compose.material.material-icons-extended.AssemblyInfo.cs
./generated/androidx.compose.material.material-icons-extended//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material-ripple//obj/Release/monoandroid9.0/androidx.compose.material.material-ripple.AssemblyInfo.cs
./generated/androidx.compose.material.material-ripple//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material-ripple//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material-ripple//obj/Release/net6.0-android/androidx.compose.material.material-ripple.AssemblyInfo.cs
./generated/androidx.compose.material.material//obj/Release/monoandroid9.0/androidx.compose.material.material.AssemblyInfo.cs
./generated/androidx.compose.material.material//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.material.material//obj/Release/net6.0-android/androidx.compose.material.material.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime-livedata//obj/Release/monoandroid9.0/androidx.compose.runtime.runtime-livedata.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime-livedata//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime-livedata//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime-livedata//obj/Release/net6.0-android/androidx.compose.runtime.runtime-livedata.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime-rxjava2//obj/Release/monoandroid9.0/androidx.compose.runtime.runtime-rxjava2.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime-rxjava2//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime-rxjava2//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime-rxjava2//obj/Release/net6.0-android/androidx.compose.runtime.runtime-rxjava2.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime-saveable//obj/Release/monoandroid9.0/androidx.compose.runtime.runtime-saveable.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime-saveable//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime-saveable//obj/Release/net6.0-android/androidx.compose.runtime.runtime-saveable.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime-saveable//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime//obj/Release/monoandroid9.0/androidx.compose.runtime.runtime.AssemblyInfo.cs
./generated/androidx.compose.runtime.runtime//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.runtime.runtime//obj/Release/net6.0-android/androidx.compose.runtime.runtime.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-geometry//obj/Release/monoandroid9.0/androidx.compose.ui.ui-geometry.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-geometry//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-geometry//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-geometry//obj/Release/net6.0-android/androidx.compose.ui.ui-geometry.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-graphics//obj/Release/monoandroid9.0/androidx.compose.ui.ui-graphics.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-graphics//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-graphics//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-graphics//obj/Release/net6.0-android/androidx.compose.ui.ui-graphics.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-text//obj/Release/monoandroid9.0/androidx.compose.ui.ui-text.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-text//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-text//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-text//obj/Release/net6.0-android/androidx.compose.ui.ui-text.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-unit//obj/Release/monoandroid9.0/androidx.compose.ui.ui-unit.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-unit//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-unit//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-unit//obj/Release/net6.0-android/androidx.compose.ui.ui-unit.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-util//obj/Release/monoandroid9.0/androidx.compose.ui.ui-util.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-util//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-util//obj/Release/net6.0-android/androidx.compose.ui.ui-util.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-util//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-viewbinding//obj/Release/monoandroid9.0/androidx.compose.ui.ui-viewbinding.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-viewbinding//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui-viewbinding//obj/Release/net6.0-android/androidx.compose.ui.ui-viewbinding.AssemblyInfo.cs
./generated/androidx.compose.ui.ui-viewbinding//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui//obj/Release/monoandroid9.0/androidx.compose.ui.ui.AssemblyInfo.cs
./generated/androidx.compose.ui.ui//obj/Release/monoandroid9.0/MonoAndroid,Version=v9.0.AssemblyAttributes.cs
./generated/androidx.compose.ui.ui//obj/Release/net6.0-android/androidx.compose.ui.ui.AssemblyInfo.cs
./generated/androidx.compose.ui.ui//obj/Release/net6.0-android/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs

Copy link
Contributor

@jpobst jpobst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's comment out all of the unused metadata. Running the XPath evaluations to apply metadata is one of the most time consuming parts of the binding process, and we know these are always go to fail, adding both time and warnings to the build.


I wonder if we should modify AndroidXProject.cshtml to look for Compose packages (by groupId and modify the <Summary>/<Description> to specify that these are not managed bindings and are only used for including Java files.

using Android.Widget;
using Android.Graphics;

namespace AndroidX.Compose.UI.Text
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment out these Additions.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed removed namespaces

config.json Outdated
"artifactId": "material-icons-extended",
"version": "1.0.0",
"nugetVersion": "1.0.0",
"nugetId": "Xamarin.AndroidX.Compose.Compose.Material.Material.Icons.Extended",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's remove all of the duplicate parts from the NuGet IDs, ie: let's make this:

Xamarin.AndroidX.Compose.Material.Icons.Extended

It looks like they consistently use the same word for the end of the groupId and the first part of the artifactId, so always deduplicating the names should not cause issues.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@moljac
Copy link
Contributor Author

moljac commented Oct 28, 2021

Any news on this? What about merging this as is and them improve?

"as is" on main/masteer for tons of users means - this must be stable... Get it?

it would lead people into trap of thinking they can use it in Xamarin world.

@4brunu
Copy link
Contributor

4brunu commented Oct 28, 2021

Oh, I see, I thought that even with the binding of the API present, the functions annotated with '@composable' wouldn't be accessible/exposed in c#.

<remove-node
path="/api/package[@name='androidx.compose.foundation']"
/>
<remove-node
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why switch to this style from the previous?

<remove-node path="path=/api/package" />

This seems like more work, and will require us to manually update this with each new namespace added to future Compose versions.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remember I asked have you ever tried that XPath which caused:

BINDINGSGENERATOR : error BG0000: System.InvalidOperationException: The XPath expression evaluated to unexpected type System.Boolean.

Tried several Xpath patterns:

https://github.com/xamarin/AndroidX/blob/mu-compose/source/androidx.compose.runtime/runtime/Transforms/Metadata.Namespaces.xml#L9-L13

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's because they duplicate the path= part, which is so subtle I didn't even notice when I copied the value for that comment. 😁

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know - staring at the code does not help... Need some time off...

fixed.

@moljac moljac removed the do-not-merge PR is still in progress and is not ready to be merged label Nov 1, 2021
@moljac moljac merged commit 9778e6b into main Nov 1, 2021
@moljac moljac deleted the mu-compose branch November 1, 2021 22:26
@4brunu
Copy link
Contributor

4brunu commented Nov 2, 2021

Thanks for your hard work in this PR, this is a great improvement to xamarin 👍

@moljac
Copy link
Contributor Author

moljac commented Nov 2, 2021

Bom dia @4brunu

and... muito obrigado.

Thanks for your hard work in this PR, this is a great improvement to xamarin

I would say - addition instead of improvement...

If you get some time to dive in deeper we might discuss it how to add full support like in Kotlin... I have some ideas, but...

@4brunu
Copy link
Contributor

4brunu commented Nov 2, 2021

Bom dia @moljac

Addition is a better word indeed.

If you get some time to dive in deeper we might discuss it how to add full support like in Kotlin... I have some ideas, but...

That would be a real challenge and I have no idea where to start or how could I help.
I imagine that to do this, it would required some understanding of the kotlin compiler, kotlin compiler plugins and jetpack compose kotlin compiler plugin?
I'm not sure, but I think it will be a real challenge.

By the way, I created a PR with some packages that are important to me and also very commonly used in apps/native libraries that use jetpack compose #419.
I tried to mimic this PR when creating that one, hope that I have done it the right way.

@ziomek64
Copy link

ziomek64 commented Jul 5, 2023

Is there any new sample for this? Old one from 2021 is not really working for me. Is it possible to build UI with jetpack compose? On .NET 7 Android

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants