Uma biblioteca Flutter/Dart que fornece utilitários e componentes padronizados para desenvolvimento de aplicações, incluindo gerenciamento de respostas, widgets reutilizáveis, validadores e integrações com funcionalidades nativas.
Adicione a dependência ao seu pubspec.yaml:
dependencies:
strawti_utils: ^1.1.0Execute:
flutter pub getO package oferece diferentes arquivos de export:
// Importação completa
import 'package:strawti_utils/strawti_utils.dart';
// Apenas utilitários básicos
import 'package:strawti_utils/utils.dart';
// Apenas infraestrutura
import 'package:strawti_utils/infra.dart';Sistema unificado para gerenciar respostas de operações assíncronas com suporte a retry automático.
Componentes Flutter otimizados para casos de uso comuns.
Funções de validação prontas para uso em formulários.
Utilitários para operações comuns como manipulação de datas.
- In-App Review: Solicitação de avaliações na loja
- In-App Update: Atualizações automáticas do aplicativo
Sistema robusto de tratamento de exceções com mensagens padronizadas.
O StrautilsResponse<T> é o coração do sistema, fornecendo uma estrutura
padronizada para todas as operações assíncronas.
success: Operação realizada com sucessowarning: Aviso (dados podem estar disponíveis)error: Erro na operação
class UserRepository extends StrautilsTryThis {
FStrautilsResponse<User> getUser(String id) async {
return tryThis(() async {
// Sua lógica aqui
final user = await api.getUser(id);
return StrautilsResponse.success(user);
},
tryAgain: () => getUser(id),
action: "buscar usuário",
);
}
}data: Dados retornados pela operaçãomessage: Mensagem para exibição na UItryAgain: Função para nova tentativasuccess,error,warning: Getters para verificar status
Widget especializado para trabalhar com StrautilsResponse de forma
declarativa.
StrautilsResponseFutureBuilder<User>(
futureResponse: userRepository.getUser(id),
builder: (context, user) {
return UserCard(user: user);
},
loadingBuilder: (context) => CircularProgressIndicator(),
errorBuilder: (context, error, message, tryAgain) {
return ErrorWidget(
message: message,
onRetry: tryAgain,
);
},
emptyBuilder: (context) => Text("Usuário não encontrado"),
)maxAttempts: Número máximo de tentativas (padrão: 3)onMaxAttempts: Callback quando limite de tentativas é atingidowarningBuilder: Widget para exibir avisos
final emailError = validateEmail(
emailController.text,
emptyMessage: "Email é obrigatório",
invalidMessage: "Email inválido",
);final nameError = validateName(
nameController.text,
emptyMessage: "Nome é obrigatório",
invalidMessage: "Nome deve ter pelo menos 2 caracteres",
);final usernameError = validateUsername(
usernameController.text,
emptyMessage: "Username é obrigatório",
invalidMessage: "Username deve ter 3-20 caracteres alfanuméricos",
);// Data atual sem horário
final today = StrautilsDateTimeHelper.nowWithoutTime;
// Comparar apenas datas
final isSameDate = StrautilsDateTimeHelper.isEqualDate(date1, date2);
// Comparar apenas horários
final isSameTime = StrautilsDateTimeHelper.isEqualTime(time1, time2);
// Comparar data e hora completas
final isSameDateTime = StrautilsDateTimeHelper.isEqualDateTime(dt1, dt2);// Ao invés de operador ternário complexo
Widget widget = ternaryClean(
isLoggedIn,
caseTrue: UserProfile(),
caseFalse: LoginButton(),
);Sistema inteligente para solicitar avaliações seguindo as melhores práticas.
await StrautilsInAppReview.instance.initialize(
appStoreId: "123456789", // Obrigatório para iOS
);final response = await StrautilsInAppReview.instance.requestReview();
if (response.success) {
print("Avaliação solicitada com sucesso");
}- Respeita intervalo de 30 dias entre solicitações
- Fallback para loja de aplicativos
- Não funciona em modo debug (segurança)
Sistema de atualizações automáticas para Android.
final response = await StrautilsInAppUpdate().updateApp(
performImmediateUpdate: true,
);final response = await StrautilsInAppUpdate().updateApp(
startFlexibleUpdate: true,
);- Disponível apenas no Android
- Suporte a atualizações flexíveis e imediatas
- Verificação automática de disponibilidade
Interface para repositórios com tratamento automático de exceções.
class ProductRepository extends StrautilsTryThis {
FStrautilsResponse<List<Product>> getProducts() async {
return tryThis(() async {
final products = await api.getProducts();
return StrautilsResponse.success(products);
},
tryAgain: () => getProducts(),
action: "buscar produtos",
);
}
}SocketException: Problemas de conexãoNoSuchMethodError: Dados inesperadosTimeoutException: Timeout de operaçõesFormatException: Formato inválidoArgumentError: Argumentos inválidosRangeError: Índice fora do intervaloStateError: Estado inválidoUnsupportedError: Operação não suportadaConcurrentModificationError: Modificação concorrenteOutOfMemoryError: Memória insuficienteHttpException: Erro de comunicação HTTP
// Erro genérico
StrautilsDefaultErrors.unknowError("fazer login");
// Erros específicos
StrautilsDefaultErrors.socketException;
StrautilsDefaultErrors.timeoutException;
StrautilsDefaultErrors.formatException;
StrautilsDefaultErrors.argumentError;
StrautilsDefaultErrors.stateError;
StrautilsDefaultErrors.httpException;StrautilsResponseFutureBuilder<List<Product>>(
futureResponse: productRepository.getProducts(),
builder: (context, products) {
return ListView.builder(
itemCount: products.length,
itemBuilder: (context, index) => ProductCard(product: products[index]),
);
},
loadingBuilder: (context) => ProductListSkeleton(),
errorBuilder: (context, error, message, tryAgain) {
return RetryWidget(
message: message,
onRetry: tryAgain,
);
},
emptyBuilder: (context) => EmptyProductsWidget(),
)class LoginForm extends StatefulWidget {
@override
Widget build(BuildContext context) {
return Form(
child: Column(
children: [
TextFormField(
validator: (value) => validateEmail(value),
decoration: InputDecoration(labelText: "Email"),
),
TextFormField(
validator: (value) => validateName(value),
decoration: InputDecoration(labelText: "Nome"),
),
ElevatedButton(
onPressed: () => _submitForm(),
child: Text("Entrar"),
),
],
),
);
}
}class UserRepository extends StrautilsTryThis {
FStrautilsResponse<User> createUser(User user) async {
return tryThis(() async {
final createdUser = await api.createUser(user);
return StrautilsResponse.success(createdUser);
},
tryAgain: () => createUser(user),
action: "criar usuário",
);
}
}O package utiliza as seguintes dependências:
get_storage: Armazenamento localin_app_review: Avaliações in-appin_app_update: Atualizações in-app
Para In-App Updates, adicione ao android/app/src/main/AndroidManifest.xml:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />O package inclui testes para os principais componentes:
flutter testEste projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Contribuições são bem-vindas! Por favor, leia as diretrizes de contribuição antes de submeter um pull request.
Para dúvidas ou problemas, abra uma issue no repositório do projeto.