我一直在研究 SliverAppBar、CustomScrollView、NestedScrollView、SliverPersistentHeader 等。我找不到一种方法来构建类似 Instagram 用户个人资料屏幕的标题,其中只有标签栏被固定。屏幕的主体是一个 TabBarView,每个窗格都有一个可滚动的列表。
使用 SliverAppBar,可以很容易地在底部参数中添加 TabBar。但我想在 TabBar 上方有一个未知/可变高度的额外小部件。当页面滚动时,额外的小部件应该滚动到一边,然后 TabBar 是固定在屏幕顶部的。
我所能管理的只是标签栏之前的固定内容和固定标签栏。我无法让标题向上滚动并将 贴TabBar在AppBar.
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(home: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: Text("pabloaleko"),
),
body: CustomScrollView(
physics: const BouncingScrollPhysics(),
slivers: <Widget>[
SliverToBoxAdapter(
child: SafeArea(
child: Text("an unknown\namount of content\n goes here in the header"),
),
),
SliverToBoxAdapter(
child: TabBar(
tabs: [
Tab(child: Text('Days', style: TextStyle(color: Colors.black))), …Run Code Online (Sandbox Code Playgroud) dart flutter flutter-layout customscrollview flutter-sliverappbar
开发了一个带有顶部和底部搜索栏的颤动页面,我们有水平列表视图,然后是垂直列表视图......当我点击搜索栏文本字段时,我的下方视图会自动滚动到顶部位置。
当我调试它时,构建方法再次调用,如何解决问题?
这与本示例https://github.com/lohanidamodar/flutter_ui_challenges 中发生的问题相同,这 是我从中获取的参考。
src\pages\hotel\hhome.dart是页面

这是我的代码,你觉得这段代码太大了,请看github示例代码(src\pages\hotel\hhome.dart)有同样的问题
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: <Widget>[
_buildSliverAppBar(),
_buildTitle('Category'),
_buildSliverCategoryList(),
_buildSliverPopularProducts(),
_buildTitle('Top Distributors'),
_buildSliverTopDistributorsList(),
_buildSliverClothing(),
_buildSliverElectronics(),
_buildSliverHealthAndBeauty(),
],
);
}
//Appbar: with "search" & "filter"
Widget _buildSliverAppBar() {
return SliverAppBar(
leading: Icon(null),
backgroundColor: colorPrimary,
elevation: 10.0,
forceElevated: true,
pinned: true,
flexibleSpace: ListView(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(left: 16.0, right: 16.0),
child: Row(
children: <Widget>[
Expanded(
child: Container(
margin: EdgeInsets.only(right: 8.0),
alignment: …Run Code Online (Sandbox Code Playgroud) 我正在尝试为应用程序创建一个事件页面,用户可以在其中查看具有横幅图像和其他一些有用信息的事件。我真的很喜欢用横幅实现 SliverAppBar 的想法,以便用户可以滚动查看更多信息。为此,我似乎需要一个带有 SliverAppBar 和FlexibleSpaceBar 的 CustomScrollView 。
我在网上看到的所有教程都假设屏幕的其余部分应该是各种列表,但我更想要像“列”小部件之类的东西。但是,Column 的高度不受限制,这会导致 CustomScrollView 中出现溢出错误。我可以将它包装在指定高度的容器中,但是主体的内容是可变大小的,所以这并不理想。有没有办法让 SliverAppBar 和 Column 并排工作?
我想要类似这样的东西:
class ActivityPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(slivers: [
SliverAppBar(
flexibleSpace: FlexibleSpaceBar(
background: Image(someImage),
),
expandedHeight: Image,
floating: false,
pinned: true,
snap: false,
),
Column(
children: [
someChildren,
]
),
)
]),
),
);
}
Run Code Online (Sandbox Code Playgroud)
这应该是可能的,因为在我看来,这似乎是一种常见的模式,但我环顾四周,只能找到主体由列表组成的示例......
https://gist.github.com/gabrielemariotti/e81e126227f8a4bb339c
Android 有用于RecyclerView的SimpleSectionedListAdapter。
这可以在 Flutter 中使用 Nested ListView 和 GridView 或 CustomScrollView 来实现。
问题是,第一个解决方案的性能不如后一个解决方案,而后一个解决方案现在有错误: https: //github.com/flutter/flutter/issues/16125
那么是否还有另一种有利于性能的方法呢?
\n我在尝试测试我的 Flutter 应用程序时遇到错误。我有一个自定义小部件,位于CustomScrollView小部件的底部(第一个视口之外)。在我的测试中,我想验证它是否确实存在。
\n我已经尝试过使用WidgetTester.scrollUntilVisibleas WidgetTester.drag(就像在flutter框架的测试中所做的那样)。此外,我尝试重构我的测试,但这FlutterDriver完全搞乱了其他一切。
\n如何滚动到CustomScrollView测试内部的底部?
\n这个最小的复制显示了包含 的应用程序,该应用CustomScrollView程序具有一个屏幕高度的容器小部件(以便我要查找的小部件不在初始视图中)
void main() {\n runApp(MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n home: Scaffold(\n body: CustomScrollView(\n slivers: [\n SliverToBoxAdapter(\n child: Container(\n height: MediaQuery.of(context).size.height,\n ),\n ),\n MyWidget(),\n ],\n )),\n );\n }\n}\n\nclass MyWidget extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return SliverToBoxAdapter(\n child: Container(\n height: 100,\n width: 100,\n ),\n );\n }\n}\n\nRun Code Online (Sandbox Code Playgroud)\n这是我最初编写的用于查找小部件的测试,当然失败了。
\nvoid main() {\n testWidgets('main …Run Code Online (Sandbox Code Playgroud) flutter flutter-test customscrollview widget-test-flutter flutter-integration-test
我使用 NestedScrollView 和 SliverAppBar 在滚动时隐藏应用程序栏。在 NestedScrollView 的主体中,我有带有 PageStorageKey 的 CustomScrollView,但是当我切换回“事件”选项卡时,滚动位置会丢失。我不明白。请你帮助我好吗?
home_screen.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:liveitup/app/screens/HomeScreen/drawer_icon.dart';
import 'package:liveitup/app/screens/HomeScreen/drawer_page.dart';
import 'package:liveitup/app/screens/HomeScreen/tabs/bottom_navigation.dart';
import 'package:liveitup/app/screens/HomeScreen/tabs/tab_item.dart';
import 'package:liveitup/app/screens/HomeScreen/tabs/tab_navigators/event_tab_navigator.dart';
import 'package:liveitup/app/screens/HomeScreen/tabs/tab_navigators/message_tab_navigator.dart';
import 'package:liveitup/app/screens/HomeScreen/tabs/tab_navigators/notification_tab_navigator.dart';
import 'package:liveitup/blocs/UserBloc/bloc.dart';
import '../../../constants.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
var _currentTab = TabItem.events;
void _selectTab(TabItem tabItem) {
setState(() => _currentTab = tabItem);
}
@override
Widget build(BuildContext context) {
var scaffoldKey = GlobalKey<ScaffoldState>();
UserBloc _userBloc …Run Code Online (Sandbox Code Playgroud) 这似乎很自然,甚至可能是预料之中的,但我仍然没有找到任何可能有帮助的东西。我在另一个可滚动小部件(父级)中有一个 ScrollablePositionedList (几乎与 ListView 相同)(我尝试过 CustomScrollView 和 ListView,甚至 NestedScrollView),我想让它看起来这样,当我滚动到子项的顶部时可滚动并仍然滑动我实际上在父可滚动中滚动。非常欢迎任何帮助,谢谢!
我是颤振新手,想知道是否有人可以帮助我进行滚动机制。SliverAppBar我是第一次尝试,它可以正确地配合杠铃本身的运动。但是,我有一个ListView.builder构建的小部件,我将其放置在 sliverfillremaining 中,但它没有检测到列表的移动。任何帮助将不胜感激。
return Scaffold(
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: Row(
children: <Widget>[
Text('appName')],),
expandedHeight: 110,
floating: true,
pinned: true,
flexibleSpace: FlexibleSpaceBar(
background: Container(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Text('my text 1', style: TextStyle(
fontFamily: 'OpenSans',
),
softWrap: true,),
Text('my Text', style: TextStyle(
fontFamily: 'OpenSans',
),),],),),),),),
SliverFillRemaining(
hasScrollBody: true,
child: Container(
child: NoteList(
items: items,
),
),
)
],
),
Run Code Online (Sandbox Code Playgroud)
笔记列表
class NoteList extends StatelessWidget {
const …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个在移动设备和桌面设备上运行良好的响应式页面。我在 NestedScrollView 中使用 SliverAppBar。问题是 NestedScrollView 中完全忽略了对容器的 maxwidth 约束。此行为也与 CustomScrollView 相同。
如何限制 NestedScrollView 主体小部件中容器的大小。
下面是代码:
import "dart:math";
import "package:flutter/material.dart";
class ResponsiveSliver extends StatefulWidget {
static const routeName = 'responsive-sliver';
@override
_ResponsiveSliverState createState() => _ResponsiveSliverState();
}
class _ResponsiveSliverState extends State<ResponsiveSliver> with SingleTickerProviderStateMixin {
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
floatHeaderSlivers: true,
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
title: Text(
"Responsive Sliver",
),
centerTitle: true,
pinned: true,
floating: true,
),
];
},
body: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 200), …Run Code Online (Sandbox Code Playgroud) nestedscrollview flutter responsive customscrollview sliverappbar
我正在尝试显示 slivergridview 视图,如果它始终为全宽,尤其是在大屏幕上,它看起来就不太好
但 CustomScrollView 只接受 sliver 小部件,这使得容器和sizedbox 无法使用。您对此的解决方法是什么?
我希望在滚动屏幕时将小部件放置在应用程序下方。屏幕包含一个具有灵活空间的浮动应用程序栏(sliverappbar),其下方是一个具有任何容器或选项卡视图的容器。链接中的视频是我想要的效果的示例。
scrollview flutter flutter-sliver flutter-layout customscrollview
customscrollview ×11
flutter ×11
listview ×3
scroll ×2
sliverappbar ×2
dart ×1
flutter-test ×1
gridview ×1
performance ×1
responsive ×1
scrollview ×1