パッケージ、リポジトリ、アプリカテゴリを検索

animated_list_plus のカバー
パッケージ詳細v0.5.2

animated_list_plus

2つのリスト間の変更を暗黙的にアニメーションするFlutterのListViewで、アイテムの再順序付けもサポートしています。

AndroidiOSWebmacOSWindowsLinux
30日間ダウンロード
3.5万
いいね数
198
Pub ポイント
150

パッケージをインストール

flutter pub add animated_list_plus

パッケージ概要

公開情報に基づく選定ガイドです。参考としてご利用ください。

AnimatedListPlus は、リストの変更時にアイテムの追加、削除、再順序付けの際のスムーズな遷移を提供する、ListView 機能を拡張する Flutter パッケージです。組み込みのアニメーションサポートにより、動的リストの実装が簡単になり、プラットフォーム間で滑らかなユーザー体験を確保します。このパッケージはすべての主要な Flutter プラットフォームをサポートしており、最小限の設定で既存のプロジェクトにシームレスに統合できます。アニメーション状態を手動で管理する必要なく、自動的に処理することでリストの操作性が向上します。

用途

  • 視覚フィードバック付きの動的リスト更新
  • フォームやタスクマネージャー内の再順序付け可能なアイテムリスト
  • チャットまたはフィードインターフェースでのスムーズな遷移
  • インタラクティブなタスクリストアプリケーション
  • ダッシュボードでのリアルタイムデータ表示

主な機能

  • リスト変更のための暗黙的なアニメーション
  • アイテムの再順序付けをサポートする組み込み機能
  • クロスプラットフォーム互換性
  • 最小限のボイラープレートコード
  • 自動アニメーション状態管理
  • カスタマイズ可能なアニメーションカーブ

適している対象

  • インタラクティブなリストベースのUIを構築する開発者
  • リアルタイムのリスト更新を必要とするアプリ
  • スムーズなUX遷移を重視するプロジェクト
  • アニメーションの複雑さを減らしたいチーム
  • Flutterの初心者が高度なリスト機能を探索しています

注意事項

  • 非常に大きなリストではパフォーマンスに影響する可能性があります
  • アイテムキーの取り扱いに注意が必要です
  • 複雑なアニメーションロジックのカスタマイズが限られている
  • 非常にカスタマイズされたアニメーションシーケンスには向かない
  • 中程度のデータセットに最適

元の README

関連するソースリポジトリの README 原文のスナップショットです。最新の内容はリポジトリをご覧ください。

Animated List Plus

Resurrection of the discontinued implicitly_animated_reorderable_list Plugin.

A Flutter ListView that implicitly calculates the changes between two lists using the MyersDiff algorithm and animates between them for you. The ImplicitlyAnimatedReorderableList adds reordering support to its items with fully custom animations.

Demo

Click here to view the full example.

Installing

Add it to your pubspec.yaml file:

dependencies:
  animated_list_plus: ^0.4.3

Install packages from the command line

flutter packages get

If you like this package, consider supporting it by giving it a star on GitHub and a like on pub.dev :heart:

Usage

The package contains two ListViews: ImplicitlyAnimatedList which is the base class and offers implicit animation for item insertions, removals as well as updates, and ImplicitlyAnimatedReorderableList which extends the ImplicitlyAnimatedList and adds reordering support to its items. See examples below on how to use them.

ImplicitlyAnimatedList

ImplicitlyAnimatedList is based on AnimatedList and uses the MyersDiff algorithm to calculate the difference between two lists and calls insertItem and removeItem on the AnimatedListState for you.

Example
// Specify the generic type of the data in the list.
ImplicitlyAnimatedList<MyGenericType>(
  // The current items in the list.
  items: items,
  // Called by the DiffUtil to decide whether two object represent the same item.
  // For example, if your items have unique ids, this method should check their id equality.
  areItemsTheSame: (a, b) => a.id == b.id,
  // Called, as needed, to build list item widgets.
  // List items are only built when they're scrolled into view.
  itemBuilder: (context, animation, item, index) {
    // Specifiy a transition to be used by the ImplicitlyAnimatedList.
    // See the Transitions section on how to import this transition.
    return SizeFadeTransition(
      sizeFraction: 0.7,
      curve: Curves.easeInOut,
      animation: animation,
      child: Text(item.name),
    );
  },
  // An optional builder when an item was removed from the list.
  // If not specified, the List uses the itemBuilder with
  // the animation reversed.
  removeItemBuilder: (context, animation, oldItem) {
    return FadeTransition(
      opacity: animation,
      child: Text(oldItem.name),
    );
  },
);

If you have a CustomScrollView you can use the SliverImplicitlyAnimatedList.

As AnimatedList doesn't support item moves, a move is handled by removing the item from the old index and inserting it at the new index.

ImplicitlyAnimatedReorderableList

ImplicitlyAnimatedReorderableList is based on ImplicitlyAnimatedList and adds reordering support to the list.

Example
ImplicitlyAnimatedReorderableList<MyGenericType>(
  items: items,
  areItemsTheSame: (oldItem, newItem) => oldItem.id == newItem.id,
  onReorderFinished: (item, from, to, newItems) {
    // Remember to update the underlying data when the list has been
    // reordered.
    setState(() {
      items
        ..clear()
        ..addAll(newItems);
    });
  },
  itemBuilder: (context, itemAnimation, item, index) {
    // Each item must be wrapped in a Reorderable widget.
    return Reorderable(
      // Each item must have an unique key.
      key: ValueKey(item),
      // The animation of the Reorderable builder can be used to
      // change to appearance of the item between dragged and normal
      // state. For example to add elevation when the item is being dragged.
      // This is not to be confused with the animation of the itemBuilder.
      // Implicit animations (like AnimatedContainer) are sadly not yet supported.
      builder: (context, dragAnimation, inDrag) {
        final t = dragAnimation.value;
        final elevation = lerpDouble(0, 8, t);
        final color = Color.lerp(Colors.white, Colors.white.withOpacity(0.8), t);

        return SizeFadeTransition(
          sizeFraction: 0.7,
          curve: Curves.easeInOut,
          animation: itemAnimation,
          child: Material(
            color: color,
            elevation: elevation,
            type: MaterialType.transparency,
            child: ListTile(
              title: Text(item.name),
              // The child of a Handle can initialize a drag/reorder.
              // This could for example be an Icon or the whole item itself. You can
              // use the delay parameter to specify the duration for how long a pointer
              // must press the child, until it can be dragged.
              trailing: Handle(
                delay: const Duration(milliseconds: 100),
                child: Icon(
                  Icons.list,
                  color: Colors.grey,
                ),
              ),
            ),
          ),
        );
      },
    );
  },
  // Since version 0.2.0 you can also display a widget
  // before the reorderable items...
  header: Container(
    height: 200,
    color: Colors.red,
  ),
  // ...and after. Note that this feature - as the list itself - is still in beta!
  footer: Container(
    height: 200,
    color: Colors.green,
  ),
  // If you want to use headers or footers, you should set shrinkWrap to true
  shrinkWrap: true,
);

For a more in depth example click here.

Transitions

You can use some custom transitions (such as the SizeFadeTransition) for item animations by importing the transitions pack:

import 'package:implicitly_animated_reorderable_list/transitions.dart';

If you want to contribute your own custom transitions, feel free to make a pull request.

Caveats

Note that this package is still in its very early phase and not enough testing has been done to guarantee stability.

Also note that computing the diff between two very large lists may take a significant amount of time (the computation is done on a background isolate though unless spawnIsolate is set to false).

Acknowledgements

The diff algorithm that ImplicitlyAnimatedList uses was written by Dawid Bota at GitLab.

カテゴリー

依存関係

依存関係一覧 2 件

ソースリポジトリ

このパッケージを使用しているプロジェクト