Как добавить фиксированную полосу между полоской прокрутки и прокруткой контента - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть представление в моем мобильном мобильном приложении, в котором есть:

  1. Верхняя полоса, которая является полоской ленты (заголовок + вкладки) [красная рамка на изображении ]
  2. A прокручиваемый список данных [зеленое поле на изображении]

При прокрутке вкладки исчезают, оставляя только заголовок страницы.

Цель:

Intended goal

Я хочу добавить заголовок [синий прямоугольник на изображении], который не исчезает при прокрутке и остается между полосой прокрутки и прокручиваемыми элементами.

Кажется, я могу поместить заголовок только внутри заголовка полоски прокрутки над вкладками или в списке с прокруткой, в этом случае он исчезает, когда я свиток

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Вы можете легко реализовать это самостоятельно. Необходимый виджет называется SliverPersistentHeader с параметром pinned, равным true, и пользовательской реализацией SliverPersistentHeaderDelegate.

. Посмотрите на этот пример:

https://dartpad.dartlang.org/6e0f6b4a212e572c7b74e5f301abc71b

enter image description here

import 'dart:math' as math;

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: CustomScrollView(
        slivers: <Widget>[
          SliverPersistentHeader(
            floating: true,
            delegate: SliverAppBarDelegate(
              minHeight: 60,
              maxHeight: 60,
              child: Container(
                color: Colors.red,
                child: Center(
                  child: Text(
                      'This will hide'),
                ),
              ),
            ),
          ),
          SliverPersistentHeader(
            pinned: true,
            delegate: SliverAppBarDelegate(
              minHeight: 60.0,
              maxHeight: 60.0,
              child: Container(
                color: Theme.of(context).scaffoldBackgroundColor,
                child: Column(
                  children: <Widget>[
                    Padding(
                      padding: const EdgeInsets.symmetric(
                        horizontal: 16.0,
                        vertical: 8.0,
                      ),
                      child: Text('This will remain visible',
                          style: TextStyle(fontSize: 20)),
                    ),
                    Divider(),
                  ],
                ),
              ),
            ),
          ),
          SliverList(
            delegate: SliverChildBuilderDelegate((context, index) {
              return ListTile(
                title: Text('List Tile $index'),
              );
            }, childCount: 100),
          ),
        ],
      ),
    );
  }
}

class SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
  SliverAppBarDelegate({
    @required this.minHeight,
    @required this.maxHeight,
    @required this.child,
  });
  final double minHeight;
  final double maxHeight;
  final Widget child;

  @override
  double get minExtent => minHeight;
  @override
  double get maxExtent => math.max(maxHeight, minHeight);
  @override
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    return SizedBox.expand(child: child);
  }

  @override
  bool shouldRebuild(SliverAppBarDelegate oldDelegate) {
    return maxHeight != oldDelegate.maxHeight ||
        minHeight != oldDelegate.minHeight ||
        child != oldDelegate.child;
  }
}
0 голосов
/ 28 апреля 2020

Завершено с помощью липкого заголовка: https://pub.dev/packages/flutter_sticky_header И сохранить тот же заголовок, не меняя его при помощи прокрутки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...