unoplatform / uno

Open-source platform for building cross-platform native Mobile, Web, Desktop and Embedded apps quickly. Create rich, C#/XAML, single-codebase apps from any IDE. Hot Reload included! 90m+ NuGet Downloads!!
https://platform.uno
Apache License 2.0
8.9k stars 720 forks source link

ListView do not scrolled after full scrolling to down and up #18551

Open kni opened 5 days ago

kni commented 5 days ago

Current behavior

I can scroll big ListView to down and return to up. Then scrolling do not work! After select element scrolling work to one full scrolling and again hangs.

Expected behavior

No response

How to reproduce it (as minimally and precisely as possible)

// dotnet new unoapp -o Foo -preset blank -markup csharp -platforms windows android -presentation mvux // Copy this to MainPage.cs file

namespace Foo;

public partial record Person(string FirstName, string LastName);

public interface IPeopleService { ValueTask<IImmutableList> GetPeopleAsync(CancellationToken ct); }

public class PeopleService : IPeopleService { public async ValueTask<IImmutableList> GetPeopleAsync(CancellationToken ct) { await Task.Delay(TimeSpan.FromSeconds(2), ct);

    var people = new Person[] {
        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa"),

        new Person(FirstName: "Master", LastName: "Yoda"),
        new Person(FirstName: "Darth", LastName: "Vader"),
        new Person(FirstName: "Luke", LastName: "Skywalker"),
        new Person(FirstName: "Han", LastName: "Solo"),
        new Person(FirstName: "Leia", LastName: "Organa")
    };

    return people.ToImmutableList();
}

}

public partial record PeopleModel(IPeopleService PeopleService) { public IState SelectedPerson => State.Empty(this); public IListFeed People => ListFeed.Async(PeopleService.GetPeopleAsync).Selection(SelectedPerson); }

public sealed partial class MainPage : Page { public MainPage() { this.DataContext(new PeopleViewModel(new PeopleService()), (page, vm) => page .Background(ThemeResource.Get("ApplicationPageBackgroundThemeBrush")) .Content(new Grid() .RowDefinitions("Auto, *, Auto") .VerticalAlignment(VerticalAlignment.Center) .HorizontalAlignment(HorizontalAlignment.Center) .Children( new TextBlock().Grid(row: 0) .Text("Hello Uno Platform!\n\nListView:\n"), new ListView().Grid(row: 1) .ItemsSource(x => x.Binding(() => vm.People)) .ItemTemplate((person) => new TextBlock().Text(() => person, person => $"{person.FirstName} {person.LastName}")), new TextBlock().Grid(row: 2) .Text(() => vm.SelectedPerson, person => $"\nSelected person: {person.FirstName} {person.LastName}\n") ) ) ); } }

Workaround

No response

Works on UWP/WinUI

None

Environment

No response

NuGet package version(s)

No response

Affected platforms

Android

IDE

Visual Studio 2022

IDE version

No response

Relevant plugins

No response

Anything else we need to know?

No response

ramezgerges commented 2 days ago

@kni Can you provide as with a full repro project in a zip? I copied the code from the issue but it's full of build errors.

kni commented 2 days ago

Foo.zip

ramezgerges commented 3 hours ago

@kni I can't reproduce on Desktop or Android. I tried the Uno.Sdk version in the zip and also the latest Uno.Sdk.

kni commented 2 hours ago

Maybe it depends on the workload?

My dotnet workload list is:

Installed Workload Id Manifest Version Installation Source

android 34.0.143/8.0.100 SDK 8.0.400, VS 17.11.35327.3 ios 18.0.8303/8.0.100 SDK 8.0.400, VS 17.11.35327.3 maccatalyst 18.0.8303/8.0.100 SDK 8.0.400, VS 17.11.35327.3 maui-windows 8.0.82/8.0.100 SDK 8.0.400, VS 17.11.35327.3

To the point. I reproduce also https://github.com/unoplatform/uno/issues/14792

ramezgerges commented 2 hours ago

@MartinZikmund Could you try the given repro? Maybe you can get it to reproduce.