【问题标题】:Add widget on ListView.builder Item widget using Positioned widget使用 Positioned 小部件在 ListView.builder 项目小部件上添加小部件
【发布时间】:2021-02-08 15:36:39
【问题描述】:

我想在 Listview 项目小部件上方添加一个小部件,但它只能显示到屏幕大小。在滚动时 ListView 堆栈项目不可见。

这是我的代码:

Stack(
  children: <Widget>[
          Positioned.fill(
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: ListView.builder(
                itemCount: 100,
                itemBuilder: (context,index){
                  return Text(index.toString());
                },

              ),
            ),
          ),


         ///In my case Emulator screen height is 600
          Positioned(
              top: 550,
              left: 100,
              child: Container(child: Text('Widget 1'),color: Colors.blue,)),

          Positioned(
              top: 650,
              left: 100,
              child: Container(child: Text('Widget 2'),color: Colors.blue,))
  ],
)

在运行此代码时,仅可见 Widget 1 标签。小部件 2 标签未显示在滚动列表视图上,小部件 1 标签也卡在同一位置。我想在滚动列表视图时显示小部件 2 标签并滚动小部件 1 标签。

【问题讨论】:

    标签: flutter listview dart stack flutter-layout


    【解决方案1】:

    您可以使用ScrollController 来实现您想要的。这将允许您获取滚动偏移量并将其应用于 Positionned 小部件。

    这是一个基于您的代码的工作示例:

    import 'dart:math';
    
    import 'package:flutter/material.dart';
    
    main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      ScrollController _scrollController = ScrollController();
    
      @override
      void initState() {
        _scrollController.addListener(() {
          setState(() {
            print(_scrollController.offset);
          });
        });
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Drawing Paths',
          home: Scaffold(
            body: Stack(
              children: <Widget>[
                Positioned.fill(
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: ListView.builder(
                      controller: _scrollController,
                      itemCount: 100,
                      itemBuilder: (context, index) {
                        return Text(index.toString());
                      },
                    ),
                  ),
                ),
    
                ///In my case Emulator screen height is 600
                Positioned(
                    top: 550 - (_scrollController.hasClients ? _scrollController.offset : 0.0),
                    left: 100,
                    child: Container(
                      child: Text('Widget 1'),
                      color: Colors.blue,
                    )),
    
                Positioned(
                    top: 650 - (_scrollController.hasClients ? _scrollController.offset : 0.0),
                    left: 100,
                    child: Container(
                      child: Text('Widget 2'),
                      color: Colors.blue,
                    ))
              ],
            ),
          ),
        );
      }
    
      @override
      void dispose() {
        _scrollController.dispose();
        super.dispose();
      }
    }
    

    【讨论】:

    • 谢谢,它可以工作,但小部件 1 标签在滚动时卡在屏幕顶部。那么有没有其他解决方案来克服这个问题?
    • 已修复,我放了 max 因为我担心溢出,但在堆栈中没问题
    猜你喜欢
    • 2021-03-17
    • 2019-11-30
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2021-06-08
    相关资源
    最近更新 更多