Флаттер, как обновить мой контроллер и запросить с помощью getx

#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 },