Flutter — JSON не будет загружаться в режиме выпуска

#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. Да, обычно, когда вы получаете серый экран, он жалуется на вложенность виджета.