#android #json #flutter #http
#Android #json #флаттер #http
Вопрос:
Итак, код отлично работает в режиме отладки, но как только я запускаю релизную версию приложения, он не работает.
Я опубликовал полный код приложения, поэтому не стесняйтесь загружать его и запускать как в режиме отладки, так и в режиме выпуска, чтобы посмотреть, что происходит.
Я в основном получаю серое поле, в котором должны загружаться изображения:
/* TO FETCH PHOTOS */
Photo photoFromJson(String str) => Photo.fromJson(json.decode(str));
String photoToJson(Photo data) => json.encode(data.toJson());
class Photo {
Photo({
this.data,
});
List<Datum> data;
factory Photo.fromJson(Map<String, dynamic> json) => Photo(
data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"data": List<dynamic>.from(data.map((x) => x.toJson())),
};
}
class Datum {
Datum({
this.id,
this.name,
this.imageurl,
this.website,
this.listenlive,
});
String id;
String name;
String imageurl;
String website;
String listenlive;
factory Datum.fromJson(Map<String, dynamic> json) => Datum(
id: json["_id"],
name: json["name"],
imageurl: json["imageurl"],
website: json["website"],
listenlive: json["listenlive"],
);
Map<String, dynamic> toJson() => {
"_id": id,
"name": name,
"imageurl": imageurl,
"website": website,
"listenlive": listenlive,
};
}
/* TO FETCH PHOTOS */
Future<Photo> fetchPhotos(http.Client client) async {
/* final response = await client.get('https://api.drn1.com.au/station/allstations');
// Use the compute function to run parsePhotos in a separate isolate.
*/
try {
final response = await client.get('https://api.drn1.com.au/station/allstations');
} catch (e) {
print(e);
}
}
// A function that converts a response body into a List<Photo>.
Photo parsePhotos(String responseBody) {
return photoFromJson(responseBody);
}
class PhotosList extends StatelessWidget {
final Photo photos;
final uuid;
FlutterRadioPlayer _flutterRadioPlayer = new FlutterRadioPlayer();
PhotosList({Key key, this.photos, this.uuid}) : super(key: key);
@override
Widget build(BuildContext context) {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1,
// childAspectRatio: MediaQuery.of(context).size.width /
// (MediaQuery.of(context).size.height / 4), //childAspectRatio: 200,
),
scrollDirection: Axis.horizontal,
itemCount: photos.data.length,
itemBuilder: (context, index) {
return RaisedButton(
padding: const EdgeInsets.all(0),
textColor: Colors.white,
color: Colors.black,
onPressed: () async { await _flutterRadioPlayer.setUrl(photos.data[index].listenlive '?uuid=' uuid, "true");
},
child: CachedNetworkImage(
imageUrl: photos.data[index].imageurl,
placeholder: (context, url) => CircularProgressIndicator(),
errorWidget: (context, url, error) => Icon(Icons.error),
),
);
// return Image.network(photos.data[index].imageurl, width: 80.0, height: 80.0,);
},
);
}
}
/*END FETCH PHOTOS*/
Основываясь на комментариях, которые я получил, это журнал, который происходит в PhotoList
The ownership chain for the RenderObject that received the incompatible parent data was:
RepaintBoundary ← NotificationListener<ScrollNotification> ← GlowingOverscrollIndicator ← Scrollable ← GridView ← PhotosList ← Expanded ← FutureBuilder<Photo> ← ColoredBox ← Container ← ⋯
When the exception was thrown, this was the stack:
#0 RenderObjectElement._updateParentData.<anonymous closure> (package:flutter/src/widgets/framework.dart:5770:11)
#1 RenderObjectElement._updateParentData (package:flutter/src/widgets/framework.dart:5786:6)
#2 RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:5808:7)
#3 RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5501:5)
#4 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6117:11)
Кроме того, я обнаружил, что он напечатал эту ошибку / предупреждение:
Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically, Expanded widgets are placed directly inside Flex widgets.
что напрямую связано с
SizedBox(
width: double.infinity,
height:200,
child: Container(
color: Colors.red,
child:
FutureBuilder<Photo>(
future: fetchPhotos(http.Client()),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? Expanded(child: PhotosList(photos: snapshot.data,uuid:_deviceId))
: Center(child: CircularProgressIndicator());
},
),
),
),
Комментарии:
1. Flutter игнорирует предупреждения о макете в режиме отладки, мне пришлось изучить это на собственном горьком опыте. При запуске в режиме отладки проверьте журнал на наличие ошибок / предупреждений, чтобы начать и перейти оттуда.
2. @krumpli хорошо, так что есть ли возможность отключить журналы для плагинов.
3. Что? Почему ты хочешь это сделать? Просто проверьте свою консоль
4. @krumpli Я обнаружил ошибку, я полагаю, поскольку RenderObject, который получил несовместимые родительские данные, был: Я добавил ошибку в вопрос
5. Да, обычно, когда вы получаете серый экран, он жалуется на вложенность виджета.