User interface 颤振ListView.builder-如何以编程方式跳转到特定索引

User interface 颤振ListView.builder-如何以编程方式跳转到特定索引,user-interface,scroll,flutter,dart,User Interface,Scroll,Flutter,Dart,我有一个使用MaterialApp、DefaultTabController、Scaffold和TabBarView构建的屏幕 在这个屏幕中,我的主体内容使用StreamBuilder从sqllite检索元素列表。我使用ListView获得精确的100个元素(“有限列表”) 我的问题是,使用ListView.builder,当这个屏幕打开时,我们如何跳转到特定的索引 我的主屏幕: ... ScrollController controller = ScrollController(); @o

我有一个使用
MaterialApp
DefaultTabController
Scaffold
TabBarView
构建的屏幕

在这个屏幕中,我的主体内容使用
StreamBuilder
从sqllite检索元素列表。我使用
ListView
获得精确的100个元素(“有限列表”)

我的问题是,使用
ListView.builder
,当这个屏幕打开时,我们如何跳转到特定的索引

我的主屏幕:

...
ScrollController controller = ScrollController();

 @override
  Widget build(BuildContext context) {

    return MaterialApp(
      debugShowCheckedModeBanner : false,
      home: DefaultTabController(
        length: 3,
        child: Scaffold(
            appBar: AppBar(
              backgroundColor: Pigment.fromString(UIData.primaryColor),
              elevation: 0,
              centerTitle: true,
              title: Text(translations.text("quran").toUpperCase()),
              bottom: TabBar(
                tabs: [
                    Text("Tab1"),
                    Text("Tab2"),
                    Text("Tab3")
                ],
              ),
              leading: Row(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Expanded(
                      child: InkWell(
                        child: SizedBox(child: Image.asset("assets/images/home.png"), height: 10, width: 1,),
                        onTap: () => Navigator.of(context).pop(),
                      )
                  ),
                ],
              ),
            ),

            floatingActionButton: FloatingActionButton(
              onPressed: _scrollToIndex,
              tooltip: 'Testing Index Jump',
              child: Text("GO"),
            ),

            body:
            TabBarView(
              children: [
                Stack(
                  children: <Widget>[
                    MyDraggableScrollBar.create(
                        scrollController: controller,
                        context: context,
                        heightScrollThumb: 25,
                        child: ListView(
                          controller: controller,
                          children: <Widget>[
                            Padding(
                                padding: EdgeInsets.fromLTRB(30, 15, 30, 8),
                                child: Container(
                                    alignment: Alignment.center,
                                    height: 30,
                                    child: ClipRRect(
                                      borderRadius: BorderRadius.circular(8),
                                      child: TextField(
                                        style: TextStyle(color: Colors.green),
                                        decoration: new InputDecoration(
                                            contentPadding: EdgeInsets.all(5),
                                            border: InputBorder.none,
                                            filled: true,
                                            hintStyle: new TextStyle(color: Colors.green, fontSize: 14),
                                            prefixIcon: Icon(FontAwesomeIcons.search,color: Colors.green,size: 17,),
                                            hintText: translations.text("search-quran"),
                                            fillColor: Colors.grey[300],
                                            prefixStyle: TextStyle(color: Colors.green)
                                        ),
                                        onChanged: (val) => quranBloc.searchSurah(val),
                                      ),
                                    )
                                )
                            ),

                            //surah list
                            streamBuilderQuranSurah(context)

                          ],
                        )
                    ) // MyDraggableScrollBar

                  ],
                ),
                Icon(Icons.directions_transit),
                Icon(Icons.directions_bike),
              ],
            )
        )));
  }

  Widget streamBuilderQuranSurah(BuildContext ctx){
    return StreamBuilder(
      stream: quranBloc.chapterStream ,
      builder: (BuildContext context, AsyncSnapshot<ChaptersModel> snapshot){
        if(snapshot.hasData){

          return ListView.builder(
            controller: controller,
            shrinkWrap: true,
            physics: NeverScrollableScrollPhysics(),
            itemCount:(snapshot.data.chapters?.length ?? 0),
            itemBuilder: (BuildContext context, int index) {
              var chapter =
              snapshot.data.chapters?.elementAt(index);
              return chapterDataCell(chapter);
            },
          );
        }
        else{

          return SurahItemShimmer();
        }
      },
    );
  }
...
。。。
ScrollController=ScrollController();
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
主页:DefaultTabController(
长度:3,
孩子:脚手架(
appBar:appBar(
背景色:颜料.fromString(UIData.primaryColor),
海拔:0,
标题:对,
标题:Text(translations.Text(“古兰经”).toUpperCase()),
底部:选项卡栏(
选项卡:[
正文(“表1”),
文本(“表2”),
文本(“表3”)
],
),
领先:世界其他地区(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
扩大(
孩子:InkWell(
child:SizedBox(child:Image.asset(“assets/images/home.png”),高度:10,宽度:1,
onTap:()=>Navigator.of(context.pop(),
)
),
],
),
),
浮动操作按钮:浮动操作按钮(
按下时:\u滚动到索引,
工具提示:“正在测试索引跳转”,
儿童:文本(“GO”),
),
正文:
塔巴视图(
儿童:[
堆叠(
儿童:[
MyDragableScrollbar.create(
滚动控制器:控制器,
上下文:上下文,
身高:25,
子:ListView(
控制器:控制器,
儿童:[
填充物(
填充:从LTRB(30,15,30,8)开始的边缘设置,
子:容器(
对齐:对齐.center,
身高:30,
孩子:ClipRRect(
边界半径:边界半径。圆形(8),
孩子:TextField(
样式:TextStyle(颜色:Colors.green),
装饰:新的输入装饰(
contentPadding:EdgeInsets.all(5),
边框:InputBorder.none,
是的,
hintStyle:new TextStyle(颜色:Colors.green,字体大小:14),
前缀:图标(FontAwesomeIcons.search,颜色:Colors.green,大小:17,),
hintText:translations.text(“搜索古兰经”),
fillColor:颜色。灰色[300],
前缀样式:文本样式(颜色:Colors.green)
),
一旦更改:(val)=>quranBloc.searchSurah(val),
),
)
)
),
//苏拉名单
streamBuilderQuranSurah(上下文)
],
)
)//MyDragableScrollbar
],
),
图标(图标、方向和交通),
图标(图标、方向和自行车),
],
)
)));
}
小部件streamBuilderQuranSurah(BuildContext ctx){
返回流生成器(
溪流:quranBloc.chapterStream,
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
返回ListView.builder(
控制器:控制器,
收缩膜:对,
物理学:NeverscrollableScroll物理学(),
itemCount:(快照.数据.章节?.长度??0),
itemBuilder:(构建上下文,int索引){
风险值章节=
快照.data.chapters?.elementAt(索引);
返回第章数据单元(第章);
},
);
}
否则{
返回SURAHITEMSHIMER();
}
},
);
}
...
MyDragableScrollbar.dart

import 'package:draggable_scrollbar/draggable_scrollbar.dart';
import 'package:flutter/material.dart';

class MyDraggableScrollBar {
  static Widget create({
    @required BuildContext context,
    @required ScrollController scrollController,
    @required double heightScrollThumb,
    @required Widget child,
  }) {
    return DraggableScrollbar(

      alwaysVisibleScrollThumb: true,
      scrollbarTimeToFade: Duration(seconds: 3),
      controller: scrollController,
      heightScrollThumb: heightScrollThumb,
      backgroundColor: Colors.green,
      scrollThumbBuilder: (
        Color backgroundColor,
        Animation<double> thumbAnimation,
        Animation<double> labelAnimation,
        double height, {
        Text labelText,
        BoxConstraints labelConstraints,
      }) {
        return InkWell(
          onTap: () {},
          child: Container(
            height: height,
            width: 7,
            color: backgroundColor,
          ),
        );
      },
      child: child,
    );
  }
}
import'package:draggable_scrollbar/draggable_scrollbar.dart';
进口“包装:颤振/材料.省道”;
类MyDragableScrollbar{
静态小部件创建({
@所需的BuildContext上下文,
@所需的ScrollController ScrollController,
@所需的双倍高度,
@必需的小部件子项,
}) {
返回可拖动滚动条(
始终可见滚动拇指:是的,
滚动次数:持续时间(秒数:3),
控制器:滚动控制器,
heightScrollThumb:heightScrollThumb,
背景颜色:Colors.green,
scrollThumbBuilder:(
颜色背景颜色,
动画,动画,,
动画labelAnimation,
双高{
文本标签文本,
BoxConstraints labelConstraints,
}) {
回墨槽(
onTap:(){},
子:容器(
高度:高度,,
wid
dependencies:
  flutter:
    sdk: flutter
  shared_preferences: "<newest version>"
  import 'package:shared_preferences/shared_preferences.dart';
  Future<void> resumeController() async{
    _sharedPreferences = await SharedPreferences.getInstance().then((_sharedPreferences){
      if(_sharedPreferences.getKeys().contains("scroll-offset-0")) _scrollController= ScrollController(initialScrollOffset:_sharedPreferences.getDouble("scroll-offset-0"));
      else _sharedPreferences.setDouble("scroll-offset-0", 0);
      setState((){});
      return _sharedPreferences;
    });
  ScrollController _scrollController;
  SharedPreferences _sharedPreferences;
  resumeController();
  WidgetsBinding.instance.addObserver(this);
 @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _scrollController.dispose();
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if(state==AppLifecycleState.paused || state==AppLifecycleState.inactive || state==AppLifecycleState.suspending)
       _sharedPreferences.setDouble("scroll-offset-0", _scrollController.offset);
    super.didChangeAppLifecycleState(state);
  }
class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> with WidgetsBindingObserver{

  //[...]
  ScrollController _scrollController;
  SharedPreferences _sharedPreferences;

  Future<void> resumeController() async{
    _sharedPreferences = await SharedPreferences.getInstance().then((_sharedPreferences){
      if(_sharedPreferences.getKeys().contains("scroll-offset-0")) _scrollController= ScrollController(initialScrollOffset:_sharedPreferences.getDouble("scroll-offset-0"));
      else _sharedPreferences.setDouble("scroll-offset-0", 0);
      setState((){});
      return _sharedPreferences;
    });

  }

  @override
  void initState() {
    resumeController();
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _scrollController.dispose();
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if(state==AppLifecycleState.paused || state==AppLifecycleState.inactive || state==AppLifecycleState.suspending)
       _sharedPreferences.setDouble("scroll-offset-0", _scrollController.offset);
    super.didChangeAppLifecycleState(state);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text("Smart Scroll View"),
        ),
        body: ListView.builder(
            itemCount: 50,
            controller: _scrollController,
            itemBuilder: (c,i)=>
                Padding(
                  padding: EdgeInsets.symmetric(horizontal: 24,vertical: 16),
                  child: Text((i+1).toString()),
                ),
        ),
      ),
    );
  }
}
IndexedListView.builder(
    controller: indexScrollController, 
    itemBuilder: itemBuilder
);


indexScrollController.jumpToIndex(10000);
ScrollablePositionedList.builder(
 initialScrollIndex: 12, //you can pass the desired index here//
 itemCount: 500,
 itemBuilder: (context, index) => Text('Item $index'),
 itemScrollController: itemScrollController,
 itemPositionsListener: itemPositionsListener,
);