Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
使用Json数据进行Flatter gridview项目导航_Json_Flutter_Dart_Flutter Navigation - Fatal编程技术网

使用Json数据进行Flatter gridview项目导航

使用Json数据进行Flatter gridview项目导航,json,flutter,dart,flutter-navigation,Json,Flutter,Dart,Flutter Navigation,我想从网格视图中的主页项目导航到根据所做选择显示数据的页面/屏幕。gridview中的项目来自JSON API(使用HTTP),我希望选择一个项目导航到一个页面,该页面列出了主页上各个项目的数据。所有这些都来自JSON。我需要你的帮助,我是个新手。 这是我的主页代码和网格视图项 import 'package:best_flutter_ui_templates/que/que_app_theme.dart'; import 'package:best_flutter_ui_templates/q

我想从网格视图中的主页项目导航到根据所做选择显示数据的页面/屏幕。gridview中的项目来自JSON API(使用HTTP),我希望选择一个项目导航到一个页面,该页面列出了主页上各个项目的数据。所有这些都来自JSON。我需要你的帮助,我是个新手。 这是我的主页代码和网格视图项

import 'package:best_flutter_ui_templates/que/que_app_theme.dart';
import 'package:best_flutter_ui_templates/que/models/category.dart';
import 'package:best_flutter_ui_templates/main.dart';
import 'package:best_flutter_ui_templates/que/que_map.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'map_search.dart';
import 'que_map.dart';
import 'models/branches.dart';
import 'services/places_service.dart';

class CompanyListView extends StatefulWidget {
  const CompanyListView({Key key, this.callBack}) : super(key: key);

  final Function callBack;
  @override
  _CompanyListViewState createState() => _CompanyListViewState();
}

class _CompanyListViewState extends State<CompanyListView>
    with TickerProviderStateMixin {
  AnimationController animationController;
  final String url = "https://que-api.herokuapp.com/companies";
  List data;
  @override
  void initState() {
    animationController = AnimationController(
        duration: const Duration(milliseconds: 2000), vsync: this);
    super.initState();
    this.getJsonData();
  }

  Future<String> getJsonData() async {
    var response = await http.get(
        //Encode the url
        Uri.encodeFull(url),
        //only accept json response
        headers: {"Accept": "application/json"});

    if (mounted)
      setState(() {
        var convertDataToJson = json.decode(response.body);
        data = convertDataToJson['data']['companies'];
      });
    print(data);
    return "Success";
  }

  Future<bool> getData() async {
    await Future<dynamic>.delayed(const Duration(milliseconds: 200));
    return true;
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.only(top: 8),
      child: FutureBuilder<String>(
          future: getJsonData(),
          builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
            return GridView(
              padding: const EdgeInsets.all(8),
              physics: const BouncingScrollPhysics(),
              scrollDirection: Axis.vertical,
              children: List<Widget>.generate(
                data.length,
                (int index) {
                  final int count = data.length;
                  final Animation<double> animation =
                      Tween<double>(begin: 0.0, end: 1.0).animate(
                    CurvedAnimation(
                      parent: animationController,
                      curve: Interval((1 / count) * index, 1.0,
                          curve: Curves.fastOutSlowIn),
                    ),
                  );
                  animationController.forward();
                  return AnimatedBuilder(
                    animation: animationController,
                    builder: (BuildContext context, Widget child) {
                      return FadeTransition(
                        opacity: animation,
                        child: Transform(
                          transform: Matrix4.translationValues(
                              0.0, 50 * (1.0 - animation.value), 0.0),
                          child: InkWell(
                            splashColor: Colors.transparent,
                            onTap: () {
                              Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                    builder: (context) => MapSearch(),
                                  ));
                            },
                            child: SizedBox(
                              height: 280,
                              child: Stack(
                                alignment: AlignmentDirectional.bottomCenter,
                                children: <Widget>[
                                  Container(
                                    child: Column(
                                      children: <Widget>[
                                        Expanded(
                                          child: Container(
                                            decoration: BoxDecoration(
                                              color: HexColor('#F8FAFB'),
                                              borderRadius:
                                                  const BorderRadius.all(
                                                      Radius.circular(16.0)),
                                              // border: new Border.all(
                                              //     color: QueAppTheme.notWhite),
                                            ),
                                            child: Column(
                                              children: <Widget>[
                                                Expanded(
                                                  child: Container(
                                                    child: Column(
                                                      children: <Widget>[
                                                        Padding(
                                                          padding:
                                                              const EdgeInsets
                                                                      .only(
                                                                  top: 16,
                                                                  left: 16,
                                                                  right: 16),
                                                          child: Text(
                                                            (data[index]
                                                                ['name']),
                                                            textAlign:
                                                                TextAlign.left,
                                                            style: TextStyle(
                                                              fontWeight:
                                                                  FontWeight
                                                                      .w600,
                                                              fontSize: 16,
                                                              letterSpacing:
                                                                  0.27,
                                                              color: QueAppTheme
                                                                  .darkerText,
                                                            ),
                                                          ),
                                                        ),
                                                        Padding(
                                                          padding:
                                                              const EdgeInsets
                                                                      .only(
                                                                  top: 8,
                                                                  left: 16,
                                                                  right: 16,
                                                                  bottom: 8),
                                                          child: Row(
                                                            mainAxisAlignment:
                                                                MainAxisAlignment
                                                                    .spaceBetween,
                                                            crossAxisAlignment:
                                                                CrossAxisAlignment
                                                                    .center,
                                                        
                                                          ),
                                                        ),
                                                      ],
                                                    ),
                                                  ),
                                                ),
                                                const SizedBox(
                                                  width: 48,
                                                ),
                                              ],
                                            ),
                                          ),
                                        ),
                                        const SizedBox(
                                          height: 48,
                                        ),
                                      ],
                                    ),
                                  ),
                                  Container(
                                    child: Padding(
                                      padding: const EdgeInsets.only(
                                          top: 20, right: 16, left: 16),
                                      child: Container(
                                        decoration: BoxDecoration(
                                          borderRadius: const BorderRadius.all(
                                              Radius.circular(16.0)),
                                          boxShadow: <BoxShadow>[
                                            BoxShadow(
                                                color: QueAppTheme.grey
                                                    .withOpacity(0.2),
                                                offset: const Offset(0.0, 0.0),
                                                blurRadius: 6.0),
                                          ],
                                        ),
                                        child: ClipRRect(
                                          borderRadius: const BorderRadius.all(
                                              Radius.circular(16.0)),
                                          child: AspectRatio(
                                              aspectRatio: 1.0,
                                              child: Image.network(
                                                  (data[index]['logo']))),
                                        ),
                                      ),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ),
                        ),
                      );
                    },
                  );
                 
                },
              ),
              gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
                mainAxisSpacing: 32.0,
                crossAxisSpacing: 32.0,
                childAspectRatio: 0.8,
              ),
            );
          }),
    );
  }
}
import'package:best_flatter_ui_templates/que/que_app_theme.dart';
导入“包:最佳颤振模板/que/models/category.dart”;
导入“包:最佳颤振模板/main.dart”;
导入“package:best_flatter_ui_templates/que/que_map.dart”;
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“dart:convert”;
导入“dart:async”;
导入“map_search.dart”;
导入'queu-map.dart';
导入“models/branchs.dart”;
导入“服务/场所_服务.dart”;
类CompanyListView扩展StatefulWidget{
constcompanylistview({Key-Key,this.callBack}):super(Key:Key);
最终函数回调;
@凌驾
_CompanyListViewState createState()=>\u CompanyListViewState();
}
类_CompanyListViewState扩展状态
使用TickerProviderStateMixin{
动画控制器;
最终字符串url=”https://que-api.herokuapp.com/companies";
列出数据;
@凌驾
void initState(){
animationController=animationController(
持续时间:常量持续时间(毫秒:2000),vsync:this;
super.initState();
这是getJsonData();
}
未来的getJsonData()异步{
var response=wait http.get(
//对url进行编码
encodeFull(url),
//仅接受json响应
标题:{“接受”:“应用程序/json”});
如果(已安装)
设置状态(){
var convertDataToJson=json.decode(response.body);
data=convertDataToJson['data']['companys'];
});
打印(数据);
返回“成功”;
}
Future getData()异步{
等待未来。延迟(常量持续时间(毫秒:200));
返回true;
}
@凌驾
小部件构建(构建上下文){
返回填充(
填充:仅限常量边集(顶部:8),
孩子:未来建设者(
future:getJsonData(),
生成器:(BuildContext上下文,异步快照){
返回网格视图(
填充:常量边集。全部(8),
物理:常量反弹CrollPhysics(),
滚动方向:轴垂直,
子项:List.generate(
数据长度,
(国际索引){
最终整数计数=data.length;
最终动画=
吐温(开始:0.0,结束:1.0)。设置动画(
曲线化(
父对象:animationController,
曲线:区间((1/计数)*指数,1.0,
曲线:曲线。快速输出),
),
);
animationController.forward();
返回动画生成器(
动画:animationController,
生成器:(BuildContext上下文,小部件子项){
返回衰减转换(
不透明度:动画,
孩子:变换(
转换:Matrix4.translationValues(
0.0,50*(1.0-动画值),0.0),
孩子:InkWell(
splashColor:Colors.transparent,
onTap:(){
导航器。推(
上下文
材料路线(
生成器:(上下文)=>MapSearch(),
));
},
孩子:大小盒子(
身高:280,
子:堆栈(
对齐:对齐方向.bottomCenter,
儿童:[
容器(
子:列(
儿童:[
扩大(
子:容器(
装饰:盒子装饰(
颜色:HexColor(“#F8FAFB”),
边界半径:
常量边界半径(
圆形半径(16.0)),
//边界:新边界(
//颜色:QueAppTheme.非白色),
),
子:列(
儿童:[
扩大(
子:容器(
子:列(
儿童:[
填充物(
衬垫:
常数边集
.只有(
排名:16,
左:16,
右:16),,
子:文本(
import 'package:best_flutter_ui_templates/que/models/branches.dart';
import 'package:best_flutter_ui_templates/que/que_app_theme.dart';
import 'package:best_flutter_ui_templates/que/screens/Selectcentservice.dart';
import 'package:best_flutter_ui_templates/que/services/geolocator_service.dart';
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:provider/provider.dart';
import 'package:geolocator/geolocator.dart';
import 'models/branches.dart';
import 'company_info_screen.dart';
import 'models/location.dart';
import 'services/marker_service.dart';
import 'services/places_service.dart';

class MapSearch extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final currentPosition = Provider.of<Position>(context);
    final placesProvider = Provider.of<Future<List<Branches>>>(context);
    final geoservice = GeoLocatorService();
    final markerService = MarkerService();

    return FutureProvider(
      create: (context) => placesProvider,
      child: Scaffold(
        body: (currentPosition != null)
            ? Consumer<List<Branches>>(
                builder: (_, places, __) {
                  var markers = (places != null)
                      ? markerService.getMarkers(places)
                      : List<Marker>();
                  return (places != null)
                      ? Column(
                          children: <Widget>[
                            Container(
                              height: MediaQuery.of(context).size.height / 3,
                              width: MediaQuery.of(context).size.width,
                              child: GoogleMap(
                                initialCameraPosition: CameraPosition(
                                    target: LatLng(currentPosition.latitude,
                                        currentPosition.longitude),
                                    zoom: 16.0),
                                zoomGesturesEnabled: true,
                                markers: Set<Marker>.of(markers),
                              ),
                            ),
                            SizedBox(
                              height: 10.0,
                            ),
                            Expanded(
                              child: ListView.builder(
                                  itemCount: places.length,
                                  itemBuilder: (context, index) {
                                    return FutureProvider(
                                      create: (context) =>
                                          geoservice.getDistance(
                                              currentPosition.latitude,
                                              currentPosition.longitude,
                                              places[index].latitude,
                                              places[index].longitude),
                                      child: Card(
                                        child: ListTile(
                                            title: Text(places[index].name),
                                            subtitle: Column(
                                              crossAxisAlignment:
                                                  CrossAxisAlignment.start,
                                              children: <Widget>[
                                                SizedBox(
                                                  height: 3.0,
                                                ),
                                              
                                                Consumer<double>(builder:
                                                    (context, meters, widget) {
                                                  return (meters != null)
                                                      ? Text(
                                                          '${places[index].vicinity}\u00b7 ${(meters / 1000).round()} km')
                                                      : Container();
                                                }),
                                              ],
                                            ),
                                            trailing: IconButton(
                                              icon: Icon(Icons.arrow_forward),
                                              color: QueAppTheme.nearlyBlue,
                                              onPressed: () {
                                                Navigator.push(
                                                    context,
                                                    MaterialPageRoute(
                                                        builder: (context) =>
                                                            Selectcentservice()));
                                              },
                                            )),
                                      ),
                                    );
                                  }),
                            )
                          ],
                        )
                      : Center(child: CircularProgressIndicator());
                },
              )
            : Center(
                child: CircularProgressIndicator(),
              ),
      ),
    );
  }
}
class MapSearch extends StatelessWidget {
final jsonData;
MapSearch({key Key,this.jsonData}):super(key:key);
  @override
  Widget build(BuildContext context) {
.......
}
     child: InkWell(
            splashColor: Colors.transparent,
            onTap: () {
                  Navigator.push(context,
                  MaterialPageRoute(builder: (context) => MapSearch(jsonData: /*Add your json data here*/),
             ));
         },
....