Json 自定义滚动视图内的分页-颤振

Json 自定义滚动视图内的分页-颤振,json,flutter,dart,Json,Flutter,Dart,我已经实现了一个CustomScrollview,其中有一个SliverGrid,我正在成功地从服务器获取数据,但是我需要在这里提供分页,我需要一些帮助,无论是通过添加一个按钮并增加值,还是通过添加一个无限滚动视图并进行分页来实现。但是如何处理UI也是我的问题,所以任何人都可以在这方面帮助我 @override Widget build(BuildContext context) { print("Home"); return WillPopScope(

我已经实现了一个CustomScrollview,其中有一个SliverGrid,我正在成功地从服务器获取数据,但是我需要在这里提供分页,我需要一些帮助,无论是通过添加一个按钮并增加值,还是通过添加一个无限滚动视图并进行分页来实现。但是如何处理UI也是我的问题,所以任何人都可以在这方面帮助我

@override
  Widget build(BuildContext context) {
    print("Home");
    return WillPopScope(
      onWillPop: exitApp,
      child: Scaffold(
        appBar: AppBar(
          leading: Image.asset('assets/images/ic_logo.png'),
          actions: <Widget>[
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: FlatButton.icon(
                onPressed: () {},
                icon: Icon(Icons.location_on),
                label: Text('Mysuru, India'),
                textColor: Colors.white,
              ),
            ),
          ],
        ),
        body: CustomScrollView(
          slivers: [
            SliverToBoxAdapter(
              child: SizedBox(
                child: _search(),
              ),
            ),
            SliverToBoxAdapter(
              child: SizedBox(
                child: FutureBuilder(
                  future: _getCat(),
                  builder: (BuildContext context, AsyncSnapshot snapshot) {
                    if (snapshot.data == null) {
                      return Center(
                        child: CircularProgressIndicator(),
                      );
                    } else {
                      return Column(
                        children: [
                          Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Row(
                              mainAxisAlignment: MainAxisAlignment.spaceBetween,
                              children: [
                                Text('Categories'),
                                GestureDetector(
                                  onTap: (){
                                    Navigator.push(context, MaterialPageRoute(builder: (context) => CategoriesScreen()));
                                  },
                                  child: Text('VIEW ALL >', style: TextStyle(decoration: TextDecoration.underline, color: Colors.redAccent),),
                                )
                              ],
                            ),
                          ),
                          Container(
                            height: 120,
                            child: ListView.builder(
                                scrollDirection: Axis.horizontal,
                                itemCount: snapshot.data.length,
                                itemBuilder: (BuildContext context, int index) {
                                  return Padding(
                                    padding: const EdgeInsets.all(2.0),
                                    child: InkWell(
                                      onTap: () {
                                        Navigator.push(context, MaterialPageRoute(builder: (context) => SubCategoriesScreen(snapshot.data[index].id,snapshot.data[index].title)));
                                      },
                                      child: Container(
                                        width: 100,
                                        child: ListTile(
                                          title: Image.network(
                                            snapshot.data[index].image,
                                            height: 60,
                                            width: 100,
                                          ),
                                          subtitle: Container(
                                              alignment: Alignment.topCenter,
                                              child: Text(
                                                snapshot.data[index].title,
                                                style: TextStyle(fontSize: 10),
                                              )),
                                        ),
                                      ),
                                    ),
                                  );
//                            return Text(snapshot.data[index].id);
                                }),
                          ),
                        ],
                      );
                    }
                  },
                ),
              ),
            ),
            SliverGrid(
              gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
                maxCrossAxisExtent: 250.0,
                mainAxisSpacing: 0.0,
                crossAxisSpacing: 0.0,
                childAspectRatio: 0.7,
              ),
              delegate: SliverChildBuilderDelegate(
                (BuildContext context, int index) {
                  return GestureDetector(
                    onTap: () {
                      print(data[index]['adid']);
                      Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) =>
                                  ProductDetailsScreen(data[index]['adid'])));
                    },
                    child: Container(
                      margin: EdgeInsets.all(5),
                      decoration:
                          BoxDecoration(border: Border.all(color: Colors.grey)),
                      child: Padding(
                        padding: const EdgeInsets.all(10),
                        child: Column(
                          children: <Widget>[
                            Expanded(
                              flex: 5,
                              child: Align(
                                alignment: Alignment.center,
                                child: Image.network(
                                  data[index]['adcoverimg'],
                                  fit: BoxFit.cover,
                                ),
                              ),
                            ),
                            SizedBox(
                              height: 10,
                            ),
                            Expanded(
                              flex: 2,
                              child: Column(
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: <Widget>[
                                  Text(
                                    '\u20B9' + data[index]['ads_price'],
                                    style: TextStyle(fontWeight: FontWeight.bold),
                                  ),
                                  Text(
                                    data[index]['adname'],
                                    style: TextStyle(fontWeight: FontWeight.w500),
                                    maxLines: 1,
                                  ),
                                  Text(
                                    data[index]['addesc'],
                                    maxLines: 1,
                                  ),
                                  Row(
                                    mainAxisAlignment: MainAxisAlignment.start,
                                    children: <Widget>[
                                      Icon(
                                        Icons.location_on,
                                        size: 18,
                                      ),
                                      Text(data[index]['ads_location'])
                                    ],
                                  )
                                ],
                              ),
                            )
                          ],
                        ),
                      ),
                    ),
                  );
                },
                childCount: data == null ? 0 : data.length,
              ),
            ),
          ],
        ),
      ),
    );
  }
@覆盖
小部件构建(构建上下文){
打印(“主页”);
返回式示波器(
onWillPop:exitApp,
孩子:脚手架(
appBar:appBar(
前导:Image.asset('assets/images/ic_logo.png'),
行动:[
填充物(
填充:常数边集全部(8.0),
子:FlatButton.icon(
按下:(){},
图标:图标(图标位置打开),
标签:文本('Mysuru,India'),
textColor:Colors.white,
),
),
],
),
正文:自定义滚动视图(
条子:[
滑动双轴适配器(
孩子:大小盒子(
子项:_search(),
),
),
滑动双轴适配器(
孩子:大小盒子(
孩子:未来建设者(
未来:_getCat(),
生成器:(BuildContext上下文,异步快照){
如果(snapshot.data==null){
返回中心(
子对象:CircularProgressIndicator(),
);
}否则{
返回列(
儿童:[
填充物(
填充:常数边集全部(8.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
文本(“类别”),
手势检测器(
onTap:(){
push(context,materialpage(builder:(context)=>CategoriesScreen());
},
子项:文本('VIEW ALL>',样式:TextStyle(装饰:TextDecoration.underline,颜色:Colors.redAccent),),
)
],
),
),
容器(
身高:120,
子项:ListView.builder(
滚动方向:轴水平,
itemCount:snapshot.data.length,
itemBuilder:(构建上下文,int索引){
返回填充(
填充:常数边集全部(2.0),
孩子:InkWell(
onTap:(){
Navigator.push(上下文,MaterialPageRoute(builder:(context)=>SubCategoriesScreen(snapshot.data[index].id,snapshot.data[index].title));
},
子:容器(
宽度:100,
孩子:ListTile(
标题:Image.network(
snapshot.data[index].image,
身高:60,
宽度:100,
),
字幕:集装箱(
对齐:alignment.topCenter,
子:文本(
snapshot.data[index].title,
样式:TextStyle(字体大小:10),
)),
),
),
),
);
//返回文本(snapshot.data[index].id);
}),
),
],
);
}
},
),
),
),
银栅(
gridDelegate:SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent:250.0,
主轴间距:0.0,
交叉轴间距:0.0,
childAspectRatio:0.7,
),
代表:SliverChildBuilderDelegate(
(BuildContext上下文,int索引){
返回手势检测器(
onTap:(){
打印(数据[索引]['adid']);
导航器。推(
上下文
材料路线(
生成器:(上下文)=>
ProductDetailsScreen(数据[索引]['adid']);
},
子:容器(
保证金:所有(5),
装饰:
BoxEdition(边框:border.all(颜色:Colors.grey)),
孩子:填充(
填充:常量边集。全部(10),
子:列(
儿童:[
扩大(
弹性:5,
子对象:对齐(
对齐:对齐.center,
Future<String> getProducts() async {
    String url = Constant.productsUrl;
    Map<String, String> headers = {'Content-Type': 'application/json'};

    final response = await http.get(url, headers: headers);
    setState(() {
      var jsonResponse = json.decode(response.body);
      data = jsonResponse['record'];
    });
  }