
Flutter Blog Engine
You've got better things to do than build another blog
Add Butter to your Flutter app and get back to more interesting problems
"Best CMS on the market"

ButterCMS is an API-based CMS for Flutter apps. Use ButterCMS with Flutter to build CMS-powered apps quickly. Use ButterCMS with Flutter to enable dynamic content in your apps for blogs, pages, and more.
Above is quick video of integrating Butter's blog engine into an application.

Butter's Blog API slides right into our apps and helps avoid having yet another WordPress site.
Daniel, Founder of Collective IdeaAll your requirements, solved
Use main domain (for SEO)
Friendly admin interface
Upload images and media
Edit slugs and meta tags
Tag and categorize posts
RSS/Atom Feeds
Search
Webhooks
Powerful admin interface

Integrates with Flutter
Our blog engine has a simple API and drop-in Flutter SDK.
Save development time
Save thousands of dollars worth of development time with our easy setup.
Gives you great SEO
Host your blog on your main domain and customize slugs and meta tags.
Try ButterCMS in your Flutter appSetup in minutes
Integrating Butter into your Flutter app is dead simple. Here's a mini tutorial to get a feel for of setting up your blog home and blog post pages. For full an integration guide check out our Official Flutter Guide
Setup the Blog page to list all our posts
We'll setup a page that fetches and displays posts:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:buttercms_dart/buttercms_dart.dart';
class PostsListScreen extends StatefulWidget {
final int page;
const PostsListScreen({Key key, this.page}) : super(key: key);
@override
_PostsListScreenState createState() => _PostsListScreenState();
}
class _PostsListScreenState extends State {
Butter butter = Butter("YOUR_API_KEY");
Map jsonMap;
@override
void initState() {
super.initState();
butter.post
.list({"page": widget.page.toString() ?? "1", "page_size": "10"}).then((response) {
setState(() {
// First fetch the json response,then decode into a map
jsonMap = json.decode(response.body);
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Posts"),
),
body: jsonMap == null ? _buildLoadingScreen() : _buildBody(),
);
}
Widget _buildLoadingScreen() {
return Center(
child: CircularProgressIndicator(),
);
}
Widget _buildBody() {
List posts = jsonMap["data"];
return ListView.builder(
itemBuilder: (context, position) {
return ListTile(
title: Text(posts[position]["title"]),
leading: Image.network(
posts[position]["fields"]["customer_logo"],
width: 40.0,
height: 40.0,
),
subtitle: Text(posts[position]["author"]["first_name"] +
" " +
posts[position]["author"]["last_name"]),
);
},
itemCount: posts.length,
);
}
}
Once the posts are fetched, we refresh our page by calling setState. All methods in the Butter package return a Future we can use for getting data or catching errors.
Setup the Blog Post page to list a single post
Here, we fetch a single blog post using the slug of the post.
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:buttercms_dart/buttercms_dart.dart';
class PostDetailScreen extends StatefulWidget {
final String pageSlug;
const PostDetailScreen({Key key, this.pageSlug}) : super(key: key);
@override
_PostDetailScreenState createState() => _PostDetailScreenState();
}
class _PostDetailScreenState extends State {
Butter butter = Butter("YOUR_API_KEY");
Map jsonMap;
@override
void initState() {
super.initState();
butter.post.retrieve(widget.pageSlug).then((response) {
setState(() {
// First fetch the json response,then decode into a map
jsonMap = json.decode(response.body);
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Post Detail"),
),
body: jsonMap == null ? _buildLoadingScreen() : _buildBody(),
);
}
Widget _buildLoadingScreen() {
return Center(
child: CircularProgressIndicator(),
);
}
Widget _buildBody() {
Map post = jsonMap["data"];
return ListView(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(post["seo_title"]),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Image.network(post["featured_image"]),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(post["meta_description"]),
),
],
);
}
}
That's it! The blog posts your created in Butter dashboard will immediately show in your app.
Try ButterCMS in your Flutter appAbout ButterCMS
ButterCMS is an API-based, or "headless", CMS. We're a hosted service and we maintain all of the infrastructure. For more information on how we compare to a traditional CMS check out API-based CMS vs Traditional CMS.
How do you compare to Wordpress?
In short, we offer all the same easy-to-use editing capabilities of Wordpress but are significantly easier for developers to setup and maintain. This means you spend less time working on your CMS and more time focusing on things important to your business.
Learn more about how we're a wordpress alternative.
What's my blog going to look like?
Unlike CMS's you might be used to, we don't control or host any of your templates. The design of your blog (HTML + CSS) lives in your application along side the rest of your app. Your application calls our Blog Engine API to get the raw blog post content and then injects it into your own templates during rendering. This has many benefits including blog your instantly matching the rest of your site branding giving it a unique feel; not the cookie-cutter blog themes you'll experience with other CMS's.
Can I import my existing blog content?
Yep. To import content from another platform, simply send us an email.
What kind of database can I use?
No database required! We're a SaaS CMS or CaaS. You simply call our Content API from your app. We host and maintain all of the CMS infrastructure.
Can I host this?
No, we're a SaaS CMS or CaaS. You simply call our Content API from your app. We host and maintain all of the CMS infrastructure.
I have other questions
We're happy to help.
Chat with usAbout Flutter
Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase.