#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)
. затем дайте мне знать.