Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在appbar中创建一个搜索,当在Flatter中向下滚动时会变成一个图标?_Flutter_Flutter Layout_Flutter Dependencies - Fatal编程技术网

Flutter 在appbar中创建一个搜索,当在Flatter中向下滚动时会变成一个图标?

Flutter 在appbar中创建一个搜索,当在Flatter中向下滚动时会变成一个图标?,flutter,flutter-layout,flutter-dependencies,Flutter,Flutter Layout,Flutter Dependencies,我已经创建了搜索栏,我需要向它添加一个功能,这样每当用户向下滚动时,搜索栏就会变成appbar中的一个图标,可以再次单击以展开 这是appbar容器 容器( 身高:122, 颜色:AppColors.kDefaultPink, 孩子:填充( 填充:常数边集全部(10.0), 子:列( 儿童:[ //位置文本 尺寸箱(高度:10.0,), 划船( mainAxisAlignment:mainAxisAlignment.center, 儿童:[ 图标( Icons.location_on, 颜色:

我已经创建了搜索栏,我需要向它添加一个功能,这样每当用户向下滚动时,搜索栏就会变成appbar中的一个图标,可以再次单击以展开

这是appbar容器

容器(
身高:122,
颜色:AppColors.kDefaultPink,
孩子:填充(
填充:常数边集全部(10.0),
子:列(
儿童:[
//位置文本
尺寸箱(高度:10.0,),
划船(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
图标(
Icons.location_on,
颜色:颜色,白色,
),
尺寸箱(宽度:12.0),
文本(“德里NCR”,样式:TextStyle(颜色:Colors.white,fontSize:18.0),
],
),
尺寸箱(高度:20.0,),
//搜索框
搜索框(onChanged:(值){}),
],
),
),

),
您可以使用LayoutBuilder获得狭长AppBar的最大高度。当max.height=80.0时,实际上意味着Silver appbar已折叠

以下是一个示例:

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
      home: MyApp(),
    ));

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var top = 0.0;
  ScrollController _scrollController;
  
    @override
  void initState() {
    _scrollController = ScrollController(keepScrollOffset: true);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: NestedScrollView(
          controller: _scrollController,
      headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
        return <Widget>[
          SliverAppBar(
              expandedHeight: 200.0,
              floating: false,
              pinned: true,
              flexibleSpace: LayoutBuilder(
                  builder: (BuildContext context, BoxConstraints constraints) {
                top = constraints.biggest.height;
                return FlexibleSpaceBar(
                    centerTitle: true,
                    title: top >= 80 ? TextField() : IconButton(icon: Icon(Icons.search), onPressed: () => _scrollController.jumpTo(0)) // condition
                );
              })),
        ];
      },body: ListView.builder(
        itemCount: 100,
        itemBuilder: (context,index){
          return Text("List Item: " + index.toString());
        },
      ),
    ));
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MaterialApp(
主页:MyApp(),
));
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
var-top=0.0;
ScrollController\u ScrollController;
@凌驾
void initState(){
_scrollController=scrollController(keepScrolOffset:true);
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:嵌套滚动视图(
控制器:\ u滚动控制器,
headerSliverBuilder:(BuildContext上下文,boolInnerBoxIsCrolled){
返回[
滑杆(
扩展高度:200.0,
浮动:假,
对,,
flexibleSpace:LayoutBuilder(
生成器:(BuildContext上下文,BoxConstraints){
顶部=约束。最大。高度;
返回柔性空格键(
标题:对,
标题:top>=80?TextField():图标按钮(图标:图标(Icons.search),ON按下:()=>\u scrollController.jumpTo(0))//条件
);
})),
];
},正文:ListView.builder(
物品计数:100,
itemBuilder:(上下文,索引){
返回文本(“列表项:+index.toString());
},
),
));
}
}

很抱歉代码混乱,但我希望您能理解这一点

您可以使用LayoutBuilder获得Slaver AppBar的最大高度。当max.height=80.0时,实际上意味着Silver appbar已折叠

以下是一个示例:

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
      home: MyApp(),
    ));

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var top = 0.0;
  ScrollController _scrollController;
  
    @override
  void initState() {
    _scrollController = ScrollController(keepScrollOffset: true);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: NestedScrollView(
          controller: _scrollController,
      headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
        return <Widget>[
          SliverAppBar(
              expandedHeight: 200.0,
              floating: false,
              pinned: true,
              flexibleSpace: LayoutBuilder(
                  builder: (BuildContext context, BoxConstraints constraints) {
                top = constraints.biggest.height;
                return FlexibleSpaceBar(
                    centerTitle: true,
                    title: top >= 80 ? TextField() : IconButton(icon: Icon(Icons.search), onPressed: () => _scrollController.jumpTo(0)) // condition
                );
              })),
        ];
      },body: ListView.builder(
        itemCount: 100,
        itemBuilder: (context,index){
          return Text("List Item: " + index.toString());
        },
      ),
    ));
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MaterialApp(
主页:MyApp(),
));
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
var-top=0.0;
ScrollController\u ScrollController;
@凌驾
void initState(){
_scrollController=scrollController(keepScrolOffset:true);
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:嵌套滚动视图(
控制器:\ u滚动控制器,
headerSliverBuilder:(BuildContext上下文,boolInnerBoxIsCrolled){
返回[
滑杆(
扩展高度:200.0,
浮动:假,
对,,
flexibleSpace:LayoutBuilder(
生成器:(BuildContext上下文,BoxConstraints){
顶部=约束。最大。高度;
返回柔性空格键(
标题:对,
标题:top>=80?TextField():图标按钮(图标:图标(Icons.search),ON按下:()=>\u scrollController.jumpTo(0))//条件
);
})),
];
},正文:ListView.builder(
物品计数:100,
itemBuilder:(上下文,索引){
返回文本(“列表项:+index.toString());
},
),
));
}
}

很抱歉代码混乱,但是,我希望您能理解我的想法,展示一些代码。您可以尝试使用sliverappbar小部件来实现此目的,并从中获取条件。您可能有兴趣查看它。@AldyYuan您能解释一下条件吗?请查看我的答案展示一些代码。您可以尝试使用sliverappbar小部件实现此目的,并从中获取条件您可能有兴趣查看。@AldyYuan您能解释一下条件吗?检查我的答案