Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 颤振-将背景渐变应用于可滚动视图_Flutter_Dart_Flutter Layout - Fatal编程技术网

Flutter 颤振-将背景渐变应用于可滚动视图

Flutter 颤振-将背景渐变应用于可滚动视图,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,有没有一种方法可以将完整的背景渐变应用到Flatter中的可滚动视图(如ListView或SingleChildScrollView)?我尝试过各种方法,比如将渐变应用到脚手架或将脚手架包装到容器中,但渐变似乎只是随着内容滚动,而不是应用到可滚动的完整高度 例如: 我无法使渐变滚动。但是,如果您不介意将ListView的子级设置为固定高度,那么有一个解决方法 将渐变保存为图像 创建一个有状态的小部件,我们的带有渐变背景的列表视图将放在这里 将刚创建的图像放置在固定高度的容器中,图像作为背景图像;

有没有一种方法可以将完整的背景渐变应用到Flatter中的可滚动视图(如ListView或SingleChildScrollView)?我尝试过各种方法,比如将渐变应用到脚手架或将脚手架包装到容器中,但渐变似乎只是随着内容滚动,而不是应用到可滚动的完整高度

例如:


我无法使渐变滚动。但是,如果您不介意将ListView的子级设置为固定高度,那么有一个解决方法

  • 将渐变保存为图像
  • 创建一个有状态的小部件,我们的带有渐变背景的
    列表视图将放在这里
  • 将刚创建的图像放置在固定高度的
    容器中
    ,图像作为背景图像;固定高度是
    列表视图的总高度
  • 使用SingleChildScrollView包装
    容器
    。为此创建一个新的
    ScrollController
  • 列表视图
    容器
    包装在
    堆栈中
    。同时为
    列表视图创建一个新的控制器
  • 在自定义小部件的initState方法中,我们将为bg设置控制器以跟踪ListView的移动
  • 我们的代码如下所示:

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          home: Scaffold(
            backgroundColor: Colors.transparent,
            body: MyListView(),
          ),
        );
      }
    }
    
    class MyListView extends StatefulWidget {
      @override
      _MyListViewState createState() => _MyListViewState();
    }
    
    class _MyListViewState extends State<MyListView> {
      final ScrollController listViewController = ScrollController();
      final ScrollController backgroundController = ScrollController();
      final int itemCount = 500;
      final double itemHeight = 20.0;
    
      @override
      void initState() {
        listViewController.addListener(() {
          backgroundController.jumpTo(listViewController.offset);
        });
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Stack(
          children: <Widget>[
    
            // Our gradient background
            SingleChildScrollView(
              physics: NeverScrollableScrollPhysics(),
              controller: backgroundController,
              child: Container(
                height: itemCount * itemHeight,
                decoration: BoxDecoration(
                  image: DecorationImage(
                    image: AssetImage('assets/images/gradient.png'),
                    fit: BoxFit.cover,
                    repeat: ImageRepeat.noRepeat,
                  ),
                ),
              ),
            ),
    
            ListView.builder(
              controller: listViewController,
              shrinkWrap: true,
              itemCount: itemCount,
              itemBuilder: (_, index) => SizedBox(
                height: itemHeight,
                child: Text(index.toString()),
              ),
            ),
          ],
        );
      }
    
      @override
      void dispose() {
        listViewController.dispose();
        backgroundController.dispose();
        super.dispose();
      }
    }
    
    导入“包装:颤振/材料.省道”;
    void main(){
    runApp(MyApp());
    }
    类MyApp扩展了无状态小部件{
    @凌驾
    小部件构建(构建上下文){
    返回材料PP(
    debugShowCheckedModeBanner:false,
    家:脚手架(
    背景颜色:颜色。透明,
    正文:MyListView(),
    ),
    );
    }
    }
    类MyListView扩展了StatefulWidget{
    @凌驾
    _MyListViewState createState()=>\u MyListViewState();
    }
    类_MyListViewState扩展状态{
    最终ScrollController listViewController=ScrollController();
    最终ScrollController背景控制器=ScrollController();
    最终整数项计数=500;
    最终双项目高度=20.0;
    @凌驾
    void initState(){
    listViewController.addListener((){
    backgroundController.jumpTo(listViewController.offset);
    });
    super.initState();
    }
    @凌驾
    小部件构建(构建上下文){
    返回堆栈(
    儿童:[
    //我们的梯度背景
    SingleChildScrollView(
    物理学:NeverscrollableScroll物理学(),
    控制员:背景控制员,
    子:容器(
    高度:itemCount*itemHeight,
    装饰:盒子装饰(
    图像:装饰图像(
    图像:AssetImage('assets/images/gradient.png'),
    适合:BoxFit.cover,
    重复:ImageRepeat.noRepeat,
    ),
    ),
    ),
    ),
    ListView.builder(
    控制器:listViewController,
    收缩膜:对,
    itemCount:itemCount,
    itemBuilder:(_,索引)=>SizedBox(
    高度:项目高度,
    子项:文本(index.toString()),
    ),
    ),
    ],
    );
    }
    @凌驾
    无效处置(){
    dispose();
    backgroundController.dispose();
    super.dispose();
    }
    }
    
    工作正常!用dartpad测试

    如果答案有效,就接受它

    import 'package:flutter/material.dart';
    
        void main() {
          runApp(MyApp());
        }
    
        class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              debugShowCheckedModeBanner: false,
              home: Scaffold(
                body: SingleChildScrollView(
                  child: Container(
                    decoration: BoxDecoration(
                      gradient: LinearGradient(
                        begin: Alignment.topCenter,
                        end: FractionalOffset.bottomCenter,
                        colors: [Colors.green, Colors.orange],
                        stops: [0, 1],
                      ),
                    ),
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: List.generate(500, (ind) {
                        return ListTile(
                          title: Text('$ind'),
                        );
                      }).toList(),
                    ),
                  ),
                ),
              ),
            );
          }
        }
    

    您好,斯文,您的解决方案运行良好(+1)。你并不需要背景图像:只要使用@notriousv2提供的原始盒子装饰,一切都很好。
    import 'package:flutter/material.dart';
    
        void main() {
          runApp(MyApp());
        }
    
        class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              debugShowCheckedModeBanner: false,
              home: Scaffold(
                body: SingleChildScrollView(
                  child: Container(
                    decoration: BoxDecoration(
                      gradient: LinearGradient(
                        begin: Alignment.topCenter,
                        end: FractionalOffset.bottomCenter,
                        colors: [Colors.green, Colors.orange],
                        stops: [0, 1],
                      ),
                    ),
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: List.generate(500, (ind) {
                        return ListTile(
                          title: Text('$ind'),
                        );
                      }).toList(),
                    ),
                  ),
                ),
              ),
            );
          }
        }