Flutter: после сборки APK данные из API не отображаются - PullRequest
2 голосов
/ 04 марта 2020

Я пытаюсь создать приложение, которое показывает некоторые данные, поступающие из API. Проблема в том, что, хотя приложение хорошо работает в режиме отладки с использованием эмулятора или смартфона, не показывая никаких ошибок. Если я создаю APK, приложение не загружает данные или, по крайней мере, не показывает их. Как я могу решить эту проблему?

Еще несколько деталей:

  • Я строил APK больше раз
  • Я установил APK в трех разных смартфонах также разных марок
import 'dart:convert';

import 'package:apiitest2/models/Obj.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;


class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  List<Obj> dataDef = List<Obj>();

  void getData() {
    List<Obj> dataDef0 = List<Obj>();
    http.get(Uri.encodeFull("https://jsonplaceholder.typicode.com/posts"),
        headers: {"Accept": "application/json"}).then((resp) {
      List data = json.decode(resp.body);
      for (var item in data) {
        Obj obj = Obj(item["userId"], item["id"], item["title"], item["body"]);
        dataDef0.add(obj);
      }
      setState(() {
        dataDef = dataDef0;
      });
    });//.catchError((onError){});
  }

  @override
  void initState() {
    super.initState();
    getData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: CustomScrollView(slivers: <Widget>[
          SliverAppBar(
            backgroundColor: Colors.red,
            floating: false,
            pinned: true,
            expandedHeight: 200.0,
            flexibleSpace: FlexibleSpaceBar(
                centerTitle: true,
                title: Text(
                  "Title",
                  style: TextStyle(
                    color: Colors.black87,
                    fontSize: 20.0,
                    fontWeight: FontWeight.bold,
                  ),
                ),
                background: Container(
                  color: Colors.amber,
                )
            ),
          ),
          body()
        ]
        )
    );
  }

  Widget body() {
    if (dataDef.isEmpty)
      return SliverToBoxAdapter(
          child: SizedBox(
            height: MediaQuery.of(context).size.height - 200,
            child: Center(
                child: Container(
                    height: 70,
                    width: 70,
                    child: CircularProgressIndicator()
                )
            ),
          )
      );
    else {
      return SliverList(delegate:
      SliverChildBuilderDelegate((BuildContext context, int index) {
        if (index > dataDef.length - 1) return null;
        return Container(
          child: Text(dataDef[index].title),
          height: 50,
        );
      }));
    }
  }
}

1 Ответ

1 голос
/ 04 марта 2020

Проблема, с которой вы столкнулись, потому что когда вы находитесь в режиме отладки, режим отладки имеет файл манифеста Android, который по умолчанию имеет разрешение inte rnet, но в src есть основная папка в это другой файл манифеста, в котором вы не дали разрешения Inte rnet. Как сказал MePo, вы должны дать inte rnet разрешение

<uses-permission android:name="android.permission.INTERNET"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...