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

rolling_nav_bar のカバー
パッケージ詳細v0.0.4

rolling_nav_bar

各アイコンの裏にローリングアクティブインジケーターがあるFlutterナビゲーションバー

30日間ダウンロード
29
いいね数
62
Pub ポイント
40

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

flutter pub add rolling_nav_bar

パッケージ概要

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

選択時に各アイコンの後ろに滑らかにロールするアクティブインジケーターを備えたFlutterのボトムナビゲーションバー。視覚フィードバックとモダンな美学によりユーザー体験を向上させるように設計されています。パッケージは軽量で簡単に統合でき、カスタマイズ可能な色、サイズ、アニメーション速度を提供します。ライトモードとダークモードの両方に対応し、標準的なFlutterナビゲーションパターンとスムーズに連携します。直感的なナビゲーションと動的な視覚的ヒントが必要なアプリに最適です。

用途

  • 下部ナビゲーション付きモバイルアプリ
  • ナビゲーションにおける強化されたユーザーのフィードバック
  • アニメーション付きの現代的なUIデザイン
  • 視覚的な仕上がりを重視するアプリ
  • カスタマイズ可能な下部バー

主な機能

  • ローリングアクティブインジケータアニメーション
  • カスタマイズ可能な色とサイズ
  • スムーズなトランジション効果
  • ライトおよびダークテーマのサポート
  • MaterialApp や Navigator との簡単な統合

適している対象

  • 現代のナビゲーションUIを求める開発者
  • デザインに注力したFlutterプロジェクト
  • 複数のボトムタブを持つアプリ
  • 最小限のセットアップを希望するチーム
  • ユーザー体験に重点を置くプロジェクト

注意事項

  • 制限されたプラットフォーム固有のカスタマイズ
  • 組み込みアイコンバッジなし
  • ルート管理を手動で処理する必要があります
  • 非常に大きなタブ数に対して最適化されていません
  • 古いデバイスではアニメーションのパフォーマンスが異なる場合があります

元の README

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

rolling_nav_bar

A bottom nav bar with layout inspired by this design and with heavily customizable animations, colors, and shapes.

Getting Started

To get started, place your RollingNavBar in the bottomNavigationCar slot of a Scaffold, wrapped in a widget that provides max height. For example:

Scaffold(
  bottomNavigationBar: Container(
    height: 95,
    child: RollingNavBar(
      // nav items
    ),
  )
);

Alternatively, you can place it directly using a Stack:

Scaffold(
  body: Stack(
    children: <Widget>[
      Positioned(
        bottom: 0,
        height: 95,
        width: MediaQuery.of(context).size.width,
        child: RollingNavBar(
          // nav items
        ),
      )
    ]
  )
);

Customization

RollingNavBar is heavily customizable and works with 3, 4, or 5 navigation elements. Each element is also fully customizable through the two primary ways to specify child navigation elements.

The first option is to pass a list of IconData objects, along with optional lists of Color objects.

RollingNavBar.iconData(
  iconData: <IconData>[
    Icons.home,
    Icons.people,
    Icons.settings,
  ],
  indicatorColors: <Color>[
    Colors.red,
    Colors.yellow,
    Colors.blue,
  ],
)

The second option is to provide a widget builder, though this comes with some loss of helpful active state management.

RollingNavBar.builder(
  builder: (context, index, info, update) {
    // The `iconData` constructor handles all active state management,
    // but this constructor, as it deals with completed widgets, must
    // assume that you have already made all relevant considerations.
    var textStyle = index == info.nextIndex
      ? TextStyle(color: Colors.white)
      : TextStyle(color: Colors.grey);
    return Text('${index + 1}', style: style);
  },
  indicatorColors: <Color>[
    Colors.red,
    Colors.yellow,
    Colors.blue,
  ],
  numChildren: 3,
)

Animation Types

RollingNavBar comes with four animation flavors for the active indicator's transition from tab to tab.

The first animation type is the namesake: AnimationType.roll:

RollingNavBar.iconData(
  animationCurve: Curves.easeOut,  // `easeOut` (the default) is recommended here
  animationType: AnimationType.roll,
  baseAnimationSpeed: 200, // milliseconds
  iconData: <IconData>[
    ...
  ],
)
Roll Example

Note: For the roll animation type, your supplied animation speed is a multiplier considered against the distance the indicator must travel. This ensures a constant speed of travel no matter where the user clicks.


The second animation type is a fade-and-reappear effect:

RollingNavBar.iconData(
  animationCurve: Curves.linear, // `linear` is recommended for `shrinkOutIn`
  animationType: AnimationType.shrinkOutIn,
  baseAnimationSpeed: 500, // slower animations look nicer for `shrinkOutIn`
  iconData: <IconData>[
    ...
  ],
)
Shrink-out-in Example

Note: For the shinkOutIn animation type, your supplied animation speed is constant, since the active indicator never travels the intermediate distance.


The third animation type is a spinning version of fade-and-reappear:

RollingNavBar.iconData(
  animationCurve: Curves.linear, // `linear` is recommended for `spinOutIn`
  animationType: AnimationType.spinOutIn,
  baseAnimationSpeed: 500, // slower animations look nicer for `spinOutIn`
  iconData: <IconData>[
    ...
  ],
)
Spin-out-in Example

Note: Like with shinkOutIn, for the spinOutIn animation type, your supplied animation speed is constant, since the active indicator never travels the intermediate distance.


The final animation flavor is a non-animation:

RollingNavBar.iconData(
  // `animationCurve` and `baseAnimationSpeed` are ignored
  animationType: AnimationType.snap,
  iconData: <IconData>[
    ...
  ],
)
Snap Example

Hooking into the animation

In the demo, the background of the larger hexagon matches the background of the nav bar hexagon. To achieve this and similar effects, two callbacks, onTap and onAnimate, are available. onAnimate can be particularly helpful for syncing visual effects elsewhere in your app with nav bar progress.

Tab Item Text

If using the iconData constructor, you are also able to pass a list of widgets to render as text below inactive icons.

RollingNavBar.iconData(
  // A list of length one implies the same color for all icons
  iconColors: <Color>[
    Colors.grey[800],
  ],
  iconData: <IconData>[
    Icons.home,
    Icons.friends,
    Icons.settings,
  ],
  iconText: <Widget>[
    Text('Home', style: TextStyle(color: Colors.grey, fontSize: 12)),
    Text('Friends', style: TextStyle(color: Colors.grey, fontSize: 12)),
    Text('Settings', style: TextStyle(color: Colors.grey, fontSize: 12)),
  ]
)
Icon Text Example

Icon badges

Using the Badges library, RollingNavBar is able to easily expose nav bar badges. The following works with either constructor.

RollingNavBar.iconData(
  badges: <Widget>[
    Text('1', style: TextStyle(Colors.white)),
    Text('1', style: TextStyle(Colors.white)),
    null,
    null,
    Text('1', style: TextStyle(Colors.white)),
  ],
  iconData: <IconData>[
    Icons.home,
    Icons.friends,
    Icons.account,
    Icons.chat,
    Icons.settings,
  ],
Badges Example

Driving Navigation Bar Changes

You can programmatically change the active navigation bar tab by passing a new activeIndex to the RollingNavBar widget. However, there are two steps to successfully keeping everything in sync.

class _MyAppState extends State<MyApp> {
  int activeIndex;

  /// Handler that responds to navigation events (likely derived
  /// from user clicks) and keeps the parent in sync.
  void _onTap(int index) {
    setState(() {
      activeIndex = index;
    });
  }

  /// Handler for when you want to programmatically change
  /// the active index. Calling `setState()` here causes
  /// Flutter to re-render the tree, which `RollingNavBar`
  /// responds to by running its normal animation.
  ///
  /// Note: This is an example function that you can define
  /// and call wherever you like. That is why it is not passed
  /// to `RollingNavBar.iconData` in the `build` method.
  void changeActiveIndex(int index) {
    setState((){
      activeIndex = index;
    });
  }

  Widget build(BuildContext context) {
    return RollingNavBar.iconData(
      activeIndex: activeIndex,
      iconData: iconData,
      onTap: _onTap,
    );
  }
}

カテゴリー

依存関係

依存関係一覧 3 件

ソースリポジトリ

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

データはまだありません。