flutter - Flutter/ 关注 ListView 中的特定小部件
问题描述
我正在开发一个带有颤振的移动应用程序。
我对列表视图有疑问。
如您所见,在 ManageAnnouncementMainScreen 小部件中获得了一个名为 selectedNumber 的道具。
我想做的是,当我导航到这个小部件时,自动关注与 selectedNumber 匹配的小部件。
这是初始屏幕。例如,如果我将 8 作为参数传递给此屏幕,我想让初始屏幕显示中间有数字 8 的小部件。就是这样。对不起,我的英语很差,我希望你明白这个问题的意义。
我只是想知道这在技术上是否可行,如果可能,请让我知道该解决方案或我可以研究的任何链接。
谢谢阅读。
我在等你的帮助。
class ManageAnnouncementMainScreen extends StatefulWidget {
ManageAnnouncementMainScreen({Key key, @required this.selectedNumber})
: super(key: key);
final int selectedNumber;
@override
_ManageAnnouncementMainScreenState createState() =>
_ManageAnnouncementMainScreenState();
}
class _ManageAnnouncementMainScreenState
extends State<ManageAnnouncementMainScreen> {
//Variable ——————————————————————————————————
Authentication authentication;
List<TestingBox> boxes = [
TestingBox(
colorCode: 1,
),
TestingBox(
colorCode: 2,
),
TestingBox(
colorCode: 3,
),
TestingBox(
colorCode: 4,
),
TestingBox(
colorCode: 5,
),
TestingBox(
colorCode: 6,
),
TestingBox(
colorCode: 7,
),
TestingBox(
colorCode: 8,
),
TestingBox(
colorCode: 9,
),
TestingBox(
colorCode: 10,
),
TestingBox(
colorCode: 11,
),
TestingBox(
colorCode: 12,
),
];
//—————————————————————————————————— Variable
//Functions——————————————————————————————————
buildBody() {
return Container(
child: ListView(children: boxes),
);
}
//——————————————————————————————————Functions
@override
Widget build(BuildContext context) {
authentication = Provider.of<Authentication>(context, listen: true);
return Scaffold(
appBar: AppBar(
title: Text(''),
),
body: buildBody(),
);
}
}
class TestingBox extends StatefulWidget {
const TestingBox({
Key key,
@required this.colorCode,
}) : super(key: key);
final int colorCode;
@override
_TestingBoxState createState() => _TestingBoxState();
}
class _TestingBoxState extends State<TestingBox> {
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
height: 150,
color: getPositionColor(widget.colorCode),
child: Center(
child: Text(
widget.colorCode.toString(),
style: TextStyle(fontWeight: FontWeight.bold),
),
),
),
);
}
}
解决方案
最好的方法是使用Google 团队开发的scrollable_positioned_list包。
然后你可以定义一个 ItemScrollController:
final ItemScrollController itemScrollController = ItemScrollController();
在 中initState()
,执行以下操作:
itemScrollController.jumpTo(index: widget.selectedNumber);
在列表视图中使用 itemScrollController:
return ScrollablePositionedList.builder(
itemCount: boxes.length,
itemBuilder: (context, index) => boxes[index],
itemScrollController: itemScrollController,
);
如果您仍想坚持使用原始 ListView,那么您可以启动 ListView 位置的一种方法是使用 ScrollController。像这样的东西:
ScrollController _scrollController = ScrollController();
var itemHeight = 150.0; // Example height of item
@override
initState() {
_scrollController = ScrollController(
initialScrollOffset: itemHeight * widget.selectedNumber);
super.initState();
}
推荐阅读
- java - Override annotation required and not - Kotlin
- mysql - MySQL ASCII 码 0-255
- php - $(document).ready 不加载外部 php 文件到 div
- laravel - 在路由上调用正确的控制器
- google-cloud-platform - 将 Caffe 添加到 Datalab 实例
- java - Android Java - 广播接收器 - 应用通知
- javascript - Images load into one
- java - 客户端如何知道服务器何时等待 Java 中的数据?
- html - 如何让引导程序将这个渲染的 django 模板居中?
- excel - VBA Help Solve 用于根据条件复制、过滤、粘贴到行中的代码