Bootstrap a Flutter app


■ Create project
■ App name
■ Basic permissions in Android
■ macOS entitlements
■ macOS persist window location and size
■ macOS floating window
■ Blank slate Flutter app
■ Version control

This is an interactive post to bootstrap a Flutter project and do basic changes to setup the project. These configurations are highly opinionated.

Create project

Project name:  

App name:  

 Org name:  

Project type:

Platforms:

iOS Language:

Android Language:

flutter create helloworld --platforms android,ios

App name

For Android, change in android/app/src/main/AndroidManifest.xml:

   <application
        android:label="Hello World"

For iOS, change in ios/Runner/Info.plist:

<key>CFBundleName</key>
<string>Hello World</string>

For Linux, change in linux/my_application.cc:

if (use_header_bar) {
    GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
    gtk_widget_show(GTK_WIDGET(header_bar));
    gtk_header_bar_set_title(header_bar, "Hello World");
    gtk_header_bar_set_show_close_button(header_bar, TRUE);
    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
  }
  else {
    gtk_window_set_title(window, "Hello World");
  }

For macOS, change in macos/Runner/Configs/AppInfo.xcconfig:

PRODUCT_NAME = Hello World

For Windows, change in windows/runner/main.cpp:

if (!window.CreateAndShow(L"Hello World", origin, size)) {
    return EXIT_FAILURE;
}

Basic permissions in Android

Edit android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

macOS entitlements

This is for non-appstore publishing. For app store you will need to enable sandbox and disable jit.

Edit macos/Runner/DebugProfile.entitlements and macos/Runner/Release.entitlements:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <false/>
	<key>com.apple.security.cs.allow-jit</key>
	<true/>
	<key>com.apple.security.network.server</key>
	<true/>
	<key>com.apple.security.network.client</key>
	<true/>
</dict>
</plist>

macOS persist window location and size

Edit macos/Runner/MainFlutterWindow.swift:

override func awakeFromNib() {
    self.setFrameAutosaveName("MainWindow")

macOS floating window

This keeps the window always on top of all windows. I find it useful while debugging.

Edit macos/Runner/MainFlutterWindow.swift:

override func awakeFromNib() {
    self.level = .floating

Blank slate Flutter app

import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Home(),
    );
  }
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [],
      ),
    );
  }
}

Version control

git init .
git add .
git commit -m "init"