Skip to content

Instantly share code, notes, and snippets.

@rafdls
Last active May 12, 2020 10:14
Show Gist options
  • Save rafdls/e9f90f17af3feafd87208788f4e940c5 to your computer and use it in GitHub Desktop.
Save rafdls/e9f90f17af3feafd87208788f4e940c5 to your computer and use it in GitHub Desktop.
Flutter Flavors code
import 'package:flutter/material.dart';
import 'package:flutter_flavors/repository/dog_repository.dart';
abstract class AppConfig {
String get appName;
DogRepository get dogRepository;
ColorSwatch get colorSwatch;
}
import 'package:flutter/material.dart';
import 'package:flutter_flavors/config/app_config.dart';
import 'package:flutter_flavors/repository/dog_repository.dart';
import 'package:flutter_flavors/repository/dog_repository_dev.dart';
class AppConfigDev implements AppConfig {
final _dogRepository = DogRepositoryDev();
final _appName = "(DEV) Dog Match";
@override
String get appName => _appName;
@override
DogRepository get dogRepository => _dogRepository;
@override
ColorSwatch get colorSwatch => Colors.orange;
}
import 'package:flutter/material.dart';
import 'package:flutter_flavors/config/app_config.dart';
import 'package:flutter_flavors/repository/dog_repository.dart';
import 'package:flutter_flavors/repository/dog_repository_prod.dart';
class AppConfigProd implements AppConfig {
final _dogRepository = DogRepositoryProd();
final _appName = "Dog Match";
@override
String get appName => _appName;
@override
DogRepository get dogRepository => _dogRepository;
@override
ColorSwatch get colorSwatch => Colors.deepPurple;
}
import 'package:flutter/material.dart';
import 'package:flutter_flavors/config/app_config.dart';
import 'package:flutter_flavors/widgets/dog_stack.dart';
import 'package:flutter_flavors/widgets/generic_button.dart';
import 'package:flutter_flavors/widgets/generic_loading_spinner.dart';
class DogApp extends StatefulWidget {
DogApp(this.appConfig);
final AppConfig appConfig;
@override
_DogAppState createState() => _DogAppState(appConfig);
}
class _DogAppState extends State<DogApp> {
_DogAppState(this.appConfig);
final AppConfig appConfig;
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: appConfig.colorSwatch,
backgroundColor: Theme.of(context).backgroundColor,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Scaffold(
appBar: AppBar(
title: Text(appConfig.appName),
centerTitle: true,
),
body: Stack(
children: <Widget>[
Center(
child: GenericButton(
child: Text('More dogs!'),
onPressed: _refreshDogImages,
),
),
Container(
color: Theme.of(context).canvasColor,
child: FutureBuilder(
key: UniqueKey(),
future: appConfig.dogRepository.getDogImages(count: 10),
builder: (context, snapshot) {
final dogImages = snapshot.data as List<ImageProvider>;
if (snapshot.hasData) {
return DogStack(images: dogImages);
} else if (snapshot.hasError) {
return Center(child: Text('There is an error in dog server'));
} else {
return Center(
child: Container(child: GenericLoadingSpinner()),
);
}
},
),
),
],
),
),
debugShowCheckedModeBanner: false,
);
}
void _refreshDogImages() {
setState(() {});
}
}
import 'package:flutter/material.dart';
abstract class DogRepository {
Future<List<ImageProvider>> getDogImages({int count});
}
import 'package:flutter/material.dart';
import 'package:flutter_flavors/repository/dog_repository.dart';
class DogRepositoryDev implements DogRepository {
@override
Future<List<ImageProvider>> getDogImages({int count = 1}) {
return Future.value(List.generate(count, (_) => AssetImage('assets/dog.jpg')));
}
}
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_flavors/repository/dog_repository.dart';
import 'package:http/http.dart' as http;
class DogRepositoryProd implements DogRepository {
@override
Future<List<ImageProvider>> getDogImages({int count = 1}) async {
final response = await http.get('https://dog.ceo/api/breeds/image/random/$count');
final List<ImageProvider> images =
(json.decode(response.body)['message'] as List).map((dogUrl) => NetworkImage(dogUrl)).toList();
return Future.value(images);
}
}
{
"version": "0.2.0",
"configurations": [
{
"name": "Dog Match Dev",
"request": "launch",
"type": "dart",
"program": "lib/main_dev.dart",
},
{
"name": "Dog Match Prod",
"request": "launch",
"type": "dart",
"program": "lib/main_prod.dart",
}
]
}
import 'package:flutter/material.dart';
import 'package:flutter_flavors/config/app_config.dart';
import 'package:flutter_flavors/dog_app.dart';
void mainCommon(AppConfig appConfig) {
runApp(DogApp(
appConfig,
));
}
import 'package:flutter_flavors/config/app_config.dart';
import 'package:flutter_flavors/config/app_config_dev.dart';
import 'package:flutter_flavors/main_common.dart';
void main() {
final AppConfig appConfig = AppConfigDev();
mainCommon(appConfig);
}
import 'package:flutter_flavors/config/app_config.dart';
import 'package:flutter_flavors/config/app_config_prod.dart';
import 'package:flutter_flavors/main_common.dart';
void main() {
final AppConfig appConfig = AppConfigProd();
mainCommon(appConfig);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment