Что мне сделать, чтобы исправить часть кода FutureBuilder?

#flutter #dart

Вопрос:

Когда я запускаю эту часть кода, выполняется только часть snapshot.hasError. Я не уверен, в какой части все пошло не так. Так может ли кто-нибудь, пожалуйста, помочь мне с этим? Заранее спасибо!!

Часть кода FutureBuilder:

 Widget futureData(BuildContext context) {  return Container(  padding: EdgeInsets.all(15),  margin: EdgeInsets.only(left: 20, right: 20, top: 10),  decoration: const BoxDecoration(  image: DecorationImage(  image: NetworkImage(  'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZCv1LyQUyAJQE21-uNUMx3S8ZgK2U9S--1wQB59QaTFHBp2VqxGTAen5FRA7m5h-E4OUamp;usqp=CAU'),  fit: BoxFit.contain)),  // child: SingleChildScrollView(  child: Column(  children: [  SizedBox(  height: 10,  ),  Center(  child: TextField(  controller: _textEditingController,  decoration: InputDecoration(  enabledBorder: OutlineInputBorder(  gapPadding: 3.0,  borderSide: const BorderSide(  color: Colors.grey,  width: 2.0,  ),  borderRadius: BorderRadius.circular(11)),  hintText: 'search',  hintStyle: const TextStyle(color: Colors.grey),  prefixIcon: const Icon(  Icons.search_sharp,  color: Colors.grey,  ),  suffixIcon: InkWell(  child: const Icon(Icons.navigate_next, color: Colors.grey),  onTap: () =gt; getInfo(),  )),  ),  ),  FutureBuilder(  future: _info,  builder: (context, snapshot) {  if (snapshot.hasError) {  return Center(child: Text("failed"));  }  if (snapshot.hasData) {  if (snapshot.data == null) {  return Text("data");  }  return Padding(  padding: const EdgeInsets.all(8.0),  child: Column(  children: [  SizedBox(  height: 20,  ),  ListView.builder(  scrollDirection: Axis.vertical,  itemCount: 1,  shrinkWrap: true,  itemBuilder: (context, index) {  return Column(  children: [  firstrow(),  SizedBox(height: 10),  secondrow(),  SizedBox(height: 2),  thirdrow(),  SizedBox(height: 20),  fourthrow(),  fifthrow(),  SizedBox(height: 20),  sixthrow(),  SizedBox(height: 10),  weatherList(),  SizedBox(height: 20),  ],  );  }),  ],  ),  );  }  return CircularProgressIndicator();  },  ),  ],  ),  // ),  );  }  

Код для анализа данных:

 TextEditingController _textEditingController = TextEditingController();  late Future _info;  late DataModel dataModel;  @override  void initState() {  super.initState();  _info = getInfo();  }   Futurelt;DataModelgt; getInfo() async {  http.Response data = await http.get(Uri.parse(  'https://api.openweathermap.org/data/2.5/forecast/daily?q=${_textEditingController.text}amp;units=metricamp;cnt=7amp;appid=3c044b7295d2df14f8bee74c19d4b96f'));  if (data.body != null) {  print("object "   data.body.toString());  dataModel = DataModel.fromJson(json.decode(data.body));  }  return dataModel;  }  

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

Комментарии:

1. Пожалуйста, проверьте свою модель данных.FromJSON(json.decode(data.body)). Похоже, у вас ошибка при анализе данных.

Ответ №1:

FutureBuilder использует экземпляр Future, но ваш метод getInfor() не возвращает будущее. Я советую определить тип возвращаемого метода как будущий.

 Futurelt;DataModelgt; getInfo() async { ... }  

затем в вашем классе виджетов:

  • определите будущий экземпляр для получения данных, возвращаемых методом getInfo (). Будущее _info;
  • внутри initState () инициализируйте переменную, присвоив ей возвращаемую методом информацию.
     @override void initState() {  super.initState();  _info = getInfo(); }  

затем внутри виджета FutureBuilder вы вызовете экземпляр Future:

 FutureBuilder(  future: _info,  ...  

Я советую установить метод getInfo() в другом файле (вы бы назвали его api_manager.dart)

Комментарии:

1. Я внес изменения, о которых вы упомянули, но все осталось по-прежнему. Я получаю данные в консоли, но не в пользовательском интерфейсе.

2. Пожалуйста, установите свой конструктор следующим образом: builder: (BuildContext context, AsyncSnapshotlt;Welcomegt; snapshot) . затем дайте мне знать.