#flutter #dart #flutter-getx
Вопрос:
Я создаю приложение с помощью getx. У меня есть простые запросы на получение, и я показываю данные на экране. На экране сведений я помещаю кнопку для обновления запроса, ответ на запрос приходит случайным образом, поэтому каждый раз, когда пользователь нажимает кнопку, будет отображаться другой текст. Я так и не понял, как это сделать.
Мой Контроллер:
class JokeController extends GetxController { var isLoading = true.obs; var joke = Joke().obs; @override void onInit() { fetchJoke(); super.onInit(); } void fetchJoke() async { isLoading(true); try { var chosenCategory = GetStorage().read("chosenCategory"); var _joke = await Requests.getJoke(chosenCategory); if (_joke != null) { joke.value = _joke; } } finally { isLoading(false); } } }
Моя Просьба:
static Futurelt;Jokegt; getJoke(String chosenCategory) async { try { var response = await client.get(Uri.parse(url)).timeout(Duration(seconds: 10)); if (response.statusCode == 200) { Joke _joke = new Joke(); var responseBody = response.body; return _joke.jokeFromJson(responseBody); } } catch (error) { return null; } }
На странице (Obx):
Obx(() { if (jokeController.isLoading.value) { return Center( child: CircularProgressIndicator().reactive(), ); } return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Center( child: Padding( padding: EdgeInsets.only( right: MediaQuery.of(context).size.width * .1, left: MediaQuery.of(context).size.width * .1), child: Text( jokeController.joke.value.value, textAlign: TextAlign.center, style: TextStyle( fontSize: MediaQuery.of(context).size.width * .06, fontWeight: FontWeight.bold), ), )), SizedBox( height: MediaQuery.of(context).size.height * .2, ), Container( alignment: Alignment.bottomCenter, width: 250, height: 60, child: Opacity( opacity: 0.88, child: ElevatedButton( style: ElevatedButton.styleFrom( padding: EdgeInsets.zero, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30)), shadowColor: Colors.orange), clipBehavior: Clip.antiAlias, onPressed: () { //Refresh the joke }, child: Ink( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.bottomCenter, end: Alignment.topCenter, colors: [ Colors.orange, Colors.orange[200] ])), child: Container( constraints: BoxConstraints(maxHeight: 300, minWidth: 50), alignment: Alignment.center, child: Text( "SEE ANOTHER JOKE FROM THIS CATEGORY", style: TextStyle( fontSize: MediaQuery.of(context).size.width * .03, fontWeight: FontWeight.bold), ), ), ), ))) ], ); })
То, что я пробовал до сих пор под давлением : jokeController.joke.refresh(); и setState и Get.to(Шутливая страница());
но ни одно из них не сработало. Также я получаю категорию из GetStorage и беру ее, когда пользователь нажимает категорию с предыдущей страницы. Эта категория не изменится. Заранее спасибо. И фотография со страницы:
Ответ №1:
Вам нужно просто еще раз вызвать fetchJoke()
метод при нажатии кнопки события. Ты можешь сделать вот так:
onPressed: () { jokeController.fetchJoke();//Refresh the joke },