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