openplanning

Hướng dẫn và ví dụ Flutter SliverAppBar

  1. SliverAppBar + CustomScrollBar
  2. SliverAppBar + NestedScrollView
Trong Flutter, SliverAppBar là một widget cung cấp một thanh ứng dụng (app bar) có thể thu gọn, hoà quyện vào nền hoặc biến mất khi cuộn.

1. SliverAppBar + CustomScrollBar

SliverAppBar thường được sử dụng cùng với một CustomScrollBar.
main_ex1.dart
Scaffold(
  // 1
  body: CustomScrollView(
    slivers: [
      // 2
      SliverAppBar(
        pinned: true,
        expandedHeight: 200.0,
        flexibleSpace: FlexibleSpaceBar(
          title: const Text(
            'Long Beach',
            textScaler: TextScaler.linear(1),
          ),
          background: Image.network(
            'https://raw.githubusercontent.com/o7planning/rs/master/flutter/long-beach.webp',
            fit: BoxFit.fitWidth,
            height: 280,
          ),
        ),
      ),
      // 3
      SliverList(
        delegate: SliverChildBuilderDelegate(
          childCount: 20,
          (_, int index) {
            return Card(
              color: Colors.white,
              child: ListTile(
                leading: Icon(Icons.image,
                    size: 32, color: Colors.indigo.withAlpha(160)),
                title: Text(
                  'SliverList Item ${index + 1}',
                  style: const TextStyle(fontSize: 12),
                  textScaler: const TextScaler.linear(2),
                ),
              ),
            );
          },
        ),
      ),
    ],
  ),
)
spinned (default = false)
SliverAppBar(
  pinned: true
)
SliverAppBar(
  pinned: false
)
Trường hợp này vùng flexibleSpace thu nhỏ lại khi thanh cuộn SliverAppBar được cuộn lên.
Trường hợp này vùng flexibleSpace bị ẩn đi khi thanh cuộn SliverAppBar được cuộn lên.
floating (default = false)
SliverAppBar(
  pinned: false,  // Or true 
  floating: true,
)
SliverAppBar(
  pinned: false,  // Or true
  floating: false,
)
Ngay khi thanh cuộn bắt đầu được kéo xuống vùng flexibleSpace sẽ xuất hiện (Hoặc tăng dần kích thước).
Khi thanh cuộn kéo xuống gần như hoàn toàn flexibleSpace mới bắt đầu xuất hiện (Hoặc tăng dần kích thước).
snap (default = false)
Khi sử dụng thuộc tính "snap" hãy đảm bảo điều kiện sau phải được thoả mãn, nếu không bạn sẽ nhận được một lỗi:
  • floating == true || snap == false
SliverAppBar(
  pinned: false, // Or true
  floating: true,
  snap: true,
)
SliverAppBar(
  pinned: false, // Or true
  floating: true,
  snap: false,
)
Khi bạn kéo thanh cuộn xuống một chút và thả tay ra khỏi màn hình, vùng flexibleSpace đột ngột được mở rộng tối đa. Sau đó bạn nhấn vào vùng flexibleSpace nó sẽ bị co lại.
Không có gì xẩy ra.

2. SliverAppBar + NestedScrollView

Ví dụ này cho thấy cách kết hợp một SliverAppBar và một NestedScrollView.
main_ex3.dart
Scaffold(
  // 1
  body: NestedScrollView(
    headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
      return [
        // 2
        SliverAppBar(
          pinned: true,
          expandedHeight: 200.0,
          flexibleSpace: FlexibleSpaceBar(
            title: const Text(
              'Long Beach',
              textScaler: TextScaler.linear(1),
            ),
            background: Container(color: Colors.red.withAlpha(70)),
          ),
        ),
        // 3
        SliverList(
          delegate: SliverChildBuilderDelegate(
            childCount: 8,
            (_, int index) {
              return Card(
                color: Colors.white,
                child: ListTile(
                  leading: Icon(Icons.image,
                      size: 32, color: Colors.indigo.withAlpha(160)),
                  title: Text(
                    'SliverList Item ${index + 1}',
                    style: const TextStyle(fontSize: 12),
                    textScaler: const TextScaler.linear(2),
                  ),
                ),
              );
            },
          ),
        ),
      ];
    },
    body: const Center(
      child: Text("Sample Text", style: TextStyle(fontSize: 20)),
    ),
  ),
)
  • Flutter NestedScrollView

Các hướng dẫn lập trình Flutter

Show More