LoginSignup
24
17

More than 5 years have passed since last update.

Flutterで起動時に一度だけ処理を実行したい

Last updated at Posted at 2019-02-23

Flutterでアプリを開発していると、アプリが起動し画面が読み込まれる前の段階で一度だけ処理を実行したいことがあると思います。
Androidで言うonCreateと同じような動作をFlutterで実現したいです。

こんなことを実現したい

  • アプリ起動時に保存された文字列を取得してTextに表示したい
  • ネット上から非同期で画像を取得して表示したい

→WEBから取得した画像を表示するための超簡単な方法があるようです。
https://qiita.com/superman9387/items/e7a669dbd7354894c860



アプリの起動時に実行したい処理は、StateクラスのinitStateをオーバーライドして、その中に処理を書くことで実現できます。
Flutterプロジェクトの作成時にデフォルトで生成されるサンプルコードを基に説明します。

main.dart
import 'package:flutter/material.dart';
//データ保存に必要なShared preferencesをインポートする
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
    _saveCounter(_counter);
  }

  // 今のカウントを保存する
  _saveCounter(int count) async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    await pref.setInt("myCount", count);
  }

  // 保存したカウントを読み込んでTextに反映させる
  _readCounter() async {
    SharedPreferences pref = await SharedPreferences.getInstance();
    setState(() {
      var data = pref.getInt("myCount");
      if (data != null) {
        _counter = data;
      }
    });
  }

  //ここが重要
  @override
  void initState(){
    //アプリ起動時に一度だけ実行される
    _readCounter();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

initState()の中でアプリ起動時に一度だけ実行したい、任意の処理を実行することができます。

@override
void initState(){
  //アプリ起動時に一度だけ実行される
  _readCounter();
}

フローティングボタンを押すとカウンターが1ずつ増え、アプリを閉じても数字を保存できるようになりました。

24
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
17