[Development] Binding evaluation during ListView delegate remove animation
Stephen Kelly
stephen.kelly at ableton.com
Thu Jan 21 14:56:42 CET 2016
On 21/01/16 00:45, Andrew den Exter wrote:
>
>
> On Thu, Jan 21, 2016 at 2:11 AM, Stephen Kelly
> <stephen.kelly at ableton.com <mailto:stephen.kelly at ableton.com>> wrote:
>
>
>> And there are the obvious runtime costs to building and
>> maintaining a cache that is of little or no use to most people
>> most of the time, which is I think a strong argument for it being
>> an off by default feature if implemented.
>>
>
> I think the cost would need to be measured before letting it
> influence design decisions. We are not talking about monstrous
> amounts of data.
>
>
> Famous last words. I have to assume any cache is going to be
> pre-populated with data from every role
Wow, that sounds bad indeed.
My idea is to cache when the data is first requested in a memoizing
design. All of those requests go through the same classes in the QML
implementation.
<snip>
> any binding with a conditional statement in it opens up the
> possibility that a role won't be accessed until after the row is removed
So you are thinking of QML code like this in a delegate:
Text {
text: someCondition ? model.someRole : model.otherRole
}
Is that correct?
In that scenario, if someCondition is always true, then my memoization
will cache the data for someRole, but not for otherRole.
Then, the row for that delegate gets removed and it gets animated away.
While it is animated away, someCondition becomes false, and the entire
binding gets re-evaluated. Because the corresponding row is already
gone, and because otherRole was never accessed while it was still there,
the data for otherRole is not memoized, and we end up again with the a
bug similar to what I posted on github with 'undefined' in the text field.
Thanks for pointing that out. It is a limitation of my proposal that
conditionally accessed data can still cause artifacts.
So here's a summary of approaches possible for this class of bug:
* Cheap memoization
* Very expensive up-front cache population
* Somehow inspect bindings in delegates to find out what roles they
could use
* Something else
For data which is conditionally accessed, the memoization does not fix
everything, but up-front caching could.
For data which is not conditionally accessed, the memoization is enough.
We can try to decide what makes sense for QML to do.
Thanks,
Steve.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20160121/027a17cb/attachment.html>
More information about the Development
mailing list