Olá amigos, neste artigo vou ensinar a utilizar um package chamado "Asyncstate", cuja finalidade é nos ajudar a chamar telas de loading com extrema facilidade.
Link: Asyncstate
O que o "Asyncstate" faz?
Através de uma "Extension" ou um "Mixin" ... o package inicia sua tela de loading ao mesmo tempo que inicia sua chamada assíncrona, mantendo a tela enquanto a chamada esta em execução e quando finalizada ele fecha a tela de loading para você.
Chega de variáveis do tipo "isLoading =false" ou "isLoading =true" ... rsrs
Vamos aos códigos ...
Importe o package:
asyncstate: ^0.0.3
Agora no "main.dart" você deve adicionar o "AsyncState.observer" no navigatorObservers:
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
themeMode: ThemeMode.dark,
navigatorObservers: [
AsyncState.observer // !!!!!
],
theme: ThemeData.dark(),
home: HomePage(),
);
}
}
Por padrão o package irá utilizar o "CircularProgressIndicator" para android e "CupertinoActionSheet" para iOS. Mas você pode edita-lo e ter o próprio loader, assim:
void main() {
AsyncState.setLoaderPersonalized(
defaultLoaderWidget: const MyLoading(), // !!!
);
runApp(const MyApp());
}
Dica: Pode alterar o loader em outra dependência de inicialização, por exemplo uma binding.
Agora em seu arquivo controller ... você pode utilizar Mixin ou Extensões.
Mixin:
Envolva sua chamada com a função "callAsyncLoader" fornecida pelo Mixin.
class HomeController with AsyncStateMixin {
Future goBack(Function callback) async {
return await callAsyncLoader(
Future.delayed(
const Duration(seconds: 3),
() {
callback();
},
),
);
}
}
Extensão:
Adicione a extensão ".asyncLoader()" ao fim de sua chamada.
Future<bool> login() async {
try {
return await Future.delayed(const Duration(seconds: 3), () {
return true;
}).asyncLoader();
} catch (e) {
// debugPrint(e.toString());
return false;
}
}
Bônus: (Loading personalizado função.)
O package permite personalizar um loader para função especifica.
Future<bool> login() async {
try {
return await Future.delayed(const Duration(seconds: 3), () {
return true;
}).asyncLoader(
customLoader: const MyCustomLoadingWidget(
text: 'Sign in! Hold on!!!!',
));
} catch (e) {
// debugPrint(e.toString());
return false;
}
}
}
Pronto, com uma sintaxe simples você não precisa mais se preocupar com suas telas de loading enquanto faz chamadas assíncronas.
Exemplo: App Exemplo
Agradeço sua leitura, espero que tenha gostado. 🤩
Top comments (0)