dart - Flutter:折叠 FlexibleSpaceBar 时更改文本

标签 dart flutter flutter-layout flutter-sliver

我查看了 Flutter 文档,试图找到在 FlexibleSpaceBar 折叠或展开时我可以 Hook 的事件、回调甚至状态。

return new FlexibleSpaceBar(
  title: new Column(
    crossAxisAlignment: CrossAxisAlignment.end,
    mainAxisAlignment: MainAxisAlignment.end,
    children: <Widget>[
        new Text(_name, style: textTheme.headline),
        new Text(_caption, style: textTheme.caption)
    ]),
  centerTitle: false,
  background: getImage());`

当 FlexibleSpaceBar 被捕捉(折叠)时,我想隐藏 _caption 文本并只显示 _name 文本。当它完全展开时,我显然想同时显示 _name_caption

我该怎么做?

我是 Flutter 的新手,所以我对此有些迷茫。

也报告于 https://github.com/flutter/flutter/issues/18567

最佳答案

创建您自己的 FlexibleSpaceBar 并不难。

enter image description here

import 'dart:math' as math;

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: SafeArea(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ScrollController controller = ScrollController();
  @override
  Widget build(BuildContext context) {
    return CustomScrollView(
      physics: ClampingScrollPhysics(),
      controller: controller,
      slivers: [
        SliverAppBar(
          expandedHeight: 220.0,
          floating: true,
          pinned: true,
          elevation: 50,
          backgroundColor: Colors.pink,
          leading: IconButton(
            icon: Icon(Icons.menu),
            onPressed: () {},
          ),
          flexibleSpace: _MyAppSpace(),
        ),
        SliverList(
          delegate: SliverChildListDelegate(
            List.generate(
              200,
              (index) => Card(
                child: Padding(
                  padding: EdgeInsets.all(10),
                  child: Text('text $index'),
                ),
              ),
            ),
          ),
        )
      ],
    );
  }
}

class _MyAppSpace extends StatelessWidget {
  const _MyAppSpace({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (context, c) {
        final settings = context
            .dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>();
        final deltaExtent = settings.maxExtent - settings.minExtent;
        final t =
            (1.0 - (settings.currentExtent - settings.minExtent) / deltaExtent)
                .clamp(0.0, 1.0) as double;
        final fadeStart = math.max(0.0, 1.0 - kToolbarHeight / deltaExtent);
        const fadeEnd = 1.0;
        final opacity = 1.0 - Interval(fadeStart, fadeEnd).transform(t);

        return Stack(
          children: [
            Center(
              child: Opacity(
                  opacity: 1 - opacity,
                  child: getTitle(
                    'Collapsed Title',
                  )),
            ),
            Opacity(
              opacity: opacity,
              child: Stack(
                alignment: Alignment.bottomCenter,
                children: [
                  getImage(),
                  getTitle(
                    'Expended Title',
                  )
                ],
              ),
            ),
          ],
        );
      },
    );
  }

  Widget getImage() {
    return Container(
      width: double.infinity,
      child: Image.network(
        'https://source.unsplash.com/daily?code',
        fit: BoxFit.cover,
      ),
    );
  }

  Widget getTitle(String text) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text(
        text,
        textAlign: TextAlign.center,
        style: TextStyle(
          color: Colors.white,
          fontSize: 26.0,
          fontWeight: FontWeight.bold,
        ),
      ),
    );
  }
}

关于dart - Flutter:折叠 FlexibleSpaceBar 时更改文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50909791/

相关文章:

flutter - 展开 Widget 以填充 ListView 中的剩余空间

dart - 如何将底页与具有文本字段的键盘一起移动(自动对焦是真的)?

Flutter Transform 将小部件从当前位置转换到另一个位置

flutter - 在 flutter 中使用 android_alarm_manager 运行后台任务

dart - 使用analyzer_experimental以编程方式解析Dart文件时收到警告

flutter - Flutter Web,HtmlElementView, “Removing disallowed attribute”

flutter - 是否可以在 flutter web 中为域添加前缀?

json - 在 Dart 中使用 JsonObject 库解析 JSON 列表

flutter - flutter 如何从相机单击正方形图像并显示正方形图像

Flutter:如何从单独的 Widget 方法调用 onPressed() 中的 setState()