Mobile app development is one of the most in-demand skills in Uganda right now. With over 80% of internet users in Uganda accessing the web via smartphones, businesses are actively looking for developers who can build Android apps that work well on affordable devices and low-bandwidth connections. Flutter, Google's cross-platform framework, is my go-to tool for this — and this guide is everything you need to get from zero to a published app on Google Play Store.
I have been building Flutter apps since 2022, with clients in Kampala, and this is the guide I wish I had when I started.
Why Flutter for Uganda?
Flutter compiles to native ARM code, which means apps run fast even on entry-level Android devices — the kind most people in Uganda and East Africa use. A single codebase covers Android and iOS, cutting development time in half. The widget library is rich and offline-first patterns are well-supported, which matters when your users are on Airtel or MTN data that drops frequently.
Step 1: Install Flutter on Windows
Most developers in Uganda work on Windows. Here is the exact setup:
- Download the Flutter SDK from flutter.dev/docs/get-started/install/windows
- Extract to
C:\flutter(avoid paths with spaces) - Add
C:\flutter\binto your Windows PATH environment variable - Run
flutter doctorin Command Prompt and fix each ❌ it shows
For Linux (Ubuntu, which I use on my development machine):
sudo snap install flutter --classic
flutter doctor
Step 2: Install Android Studio
Download Android Studio from developer.android.com/studio. During installation, make sure the Android SDK, Android SDK Platform-Tools, and Android Virtual Device components are selected.
After installation, run:
flutter doctor --android-licenses
Accept all licenses. This step trips up many beginners in Uganda — do not skip it.
Step 3: Create Your First Flutter Project
flutter create my_ugandan_app
cd my_ugandan_app
flutter run
This launches the default counter app on your emulator or connected Android phone. If you are using a physical device (recommended — it is faster than emulators on most Ugandan developer hardware), enable USB Debugging in your phone's Developer Options first.
Step 4: Understand the Project Structure
The important folders:
lib/— all your Dart code lives here.main.dartis the entry point.android/— Android-specific config. You will touch this for permissions and Play Store metadata.pubspec.yaml— your dependencies file. Likecomposer.jsonfor PHP.assets/— images, fonts, and other static files.
Step 5: Build a Simple Home Screen
Replace the contents of lib/main.dart with a clean starting point:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF1A56DB)),
useMaterial3: true,
),
home: const HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Welcome'),
backgroundColor: Theme.of(context).colorScheme.primary,
foregroundColor: Colors.white,
),
body: const Center(
child: Text(
'Hello, Uganda!',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
),
);
}
}
Step 6: Key Packages Every Ugandan App Needs
Add these to pubspec.yaml under dependencies:
dependencies:
flutter:
sdk: flutter
http: ^1.2.0 # API calls to your Laravel backend
provider: ^6.1.0 # State management
shared_preferences: ^2.2.0 # Local storage (remember login sessions)
flutter_secure_storage: ^9.0.0 # Store tokens securely
cached_network_image: ^3.3.0 # Images with offline caching
connectivity_plus: ^6.0.0 # Detect network status (critical for Uganda)
flutter_svg: ^2.0.0 # SVG support
Run flutter pub get to install them.
Step 7: Handle Offline Gracefully
Network reliability in Uganda means your app must handle offline states gracefully. Add a connectivity check to your app:
import 'package:connectivity_plus/connectivity_plus.dart';
Future<bool> isConnected() async {
final result = await Connectivity().checkConnectivity();
return result != ConnectivityResult.none;
}
// Use it before API calls:
if (!await isConnected()) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('No internet connection. Please check your data.')),
);
return;
}
Step 8: Connect to Your Laravel Backend
Create lib/services/api_service.dart:
import 'package:http/http.dart' as http;
import 'dart:convert';
class ApiService {
static const String baseUrl = 'https://yourlaravelapp.com/api';
static Future<Map<String, dynamic>> get(String endpoint, String token) async {
final response = await http.get(
Uri.parse('$baseUrl/$endpoint'),
headers: {
'Authorization': 'Bearer $token',
'Accept': 'application/json',
},
);
if (response.statusCode == 200) {
return jsonDecode(response.body);
} else {
throw Exception('API error: ${response.statusCode}');
}
}
}
Step 9: Build the Release APK
Before building for release, update your app details in android/app/build.gradle:
android {
defaultConfig {
applicationId "com.yourname.yourapp"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0.0"
}
}
Generate a signing key (run this once):
keytool -genkey -v -keystore ~/my-app-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key
Then build:
flutter build appbundle
This creates an .aab file in build/app/outputs/bundle/release/ — that is what you upload to Google Play.
Step 10: Publish to Google Play Store
- Go to play.google.com/console and create a developer account. The one-time fee is $25 USD (about UGX 93,000). Pay via Visa card or Google Pay.
- Create a new app, fill in the store listing (title, description, screenshots)
- Upload your
.aabfile under Production → Releases - Complete the content rating questionnaire
- Submit for review — Google reviews typically take 1–3 days
Common Issues for Ugandan Developers
- Play Console payment: If your Ugandan Visa card is declined, try a Equity Bank or Stanbic Bank Visa. Some developers use a relative's card abroad.
- Slow emulator: Enable HAXM acceleration in Android Studio, or just use a physical phone — much faster on typical Uganda developer hardware.
- Build takes too long: Add
org.gradle.daemon=trueandorg.gradle.parallel=truetoandroid/gradle.properties.
Next Steps
Once your app is live, explore adding Firebase for push notifications, Flutter's geolocator package for location features, and MoMo/Airtel Money payments. These are the most requested features by Ugandan business clients.
Need help building a Flutter app for your business or client in Uganda? Get in touch — I build production Flutter apps for clients across Kampala and East Africa.