質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

662閲覧

アプリをアクティブ(最前列)にした時に処理をさせる方法

copp

総合スコア11

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/11/05 08:38

前提・実現したいこと

・アプリ1を起動した状態でアプリ2を起動すると、アプリ2がアクティブ(最前列に表示される)になり、
アプリ1がノンアクティブ(2列目)になると思います。

上記のようにアクティブでない状態から、アプリをアクティブに戻した際に処理を行いたい場合、
どのように記載するばよろしいのでしょうか?

作成したサンプルの場合、アプリをアクティブに戻した際に30分以上経過していたら現在の時間を表示するようにしたいと考えております。

お手数ではございますが御教唆お願いいたします

発生している問題・エラーメッセージ

アプリをアクティブ(最前列)にした際に通る関数等がわかりませんでした

該当のソースコード

dart

1// main.dart 2import 'package:display_time/app_page.dart'; 3import 'package:display_time/app_state.dart'; 4import 'package:flutter/material.dart'; 5import 'package:flutter_state_notifier/flutter_state_notifier.dart'; 6import 'package:provider/provider.dart'; 7 8void main() { 9 runApp( 10 MultiProvider( 11 providers: [ 12 StateNotifierProvider<AppController, AppState>( 13 create: (_) => AppController(), 14 ), 15 ], 16 child: MyApp(), 17 ), 18 ); 19}

dart

1// app_state.dart 2import 'package:flutter/foundation.dart'; 3import 'package:flutter/material.dart'; 4import 'package:freezed_annotation/freezed_annotation.dart'; 5import 'package:state_notifier/state_notifier.dart'; 6 7part 'app_state.freezed.dart'; 8 9 10abstract class AppState with _$AppState { 11 const factory AppState({ 12 DateTime time, 13 }) = _AppState; 14} 15 16class AppController extends StateNotifier<AppState> with LocatorMixin { 17 AppController() : super(const AppState()); 18 19 20 void initState() { 21 state = state.copyWith(time: DateTime.now()); 22 } 23 24 void compareTime() { 25 print('compareTime: ${DateTime.now()}'); 26 final _now = DateTime.now(); 27 // 30分以上経っていたら今の時間を入れる 28 if (_now.compareTo(state.time.add(const Duration(minutes: 30))) == 1) { 29 state = state.copyWith(time: _now); 30 } 31 } 32}

dart

1// app_page.dart 2import 'package:display_time/app_state.dart'; 3import 'package:flutter/material.dart'; 4import 'package:provider/provider.dart'; 5 6class MyApp extends StatelessWidget { 7 8 Widget build(BuildContext context) { 9 return MaterialApp( 10 title: 'Time Demo', 11 theme: ThemeData( 12 primarySwatch: Colors.blue, 13 ), 14 home: const HomePage(), 15 ); 16 } 17} 18 19class HomePage extends StatelessWidget { 20 const HomePage({Key key}) : super(key: key); 21 22 23 Widget build(BuildContext context) { 24 // ここではアクティブに戻した時には実行されませんでした 25 // context.watch<AppController>().compareTime(); 26 27 return Scaffold( 28 appBar: AppBar( 29 title: const Text('Time Demo'), 30 ), 31 body: Text( 32 context.select((AppState value) => value.time.toString()), 33 ), 34 ); 35 } 36}

dart

1// app_state.freezed.dart 2// ターミナルでflutter packages pub run build_runner buildを実行すると作成されます

dart

1// pubspe.yaml 2name: display_time 3description: A new Flutter application. 4 5publish_to: 'none' # Remove this line if you wish to publish to pub.dev 6 7version: 1.0.0+1 8 9environment: 10 sdk: ">=2.7.0 <3.0.0" 11 12dependencies: 13 flutter: 14 sdk: flutter 15 freezed_annotation: 16 flutter_state_notifier: ^0.6.1 17 provider: ^4.3.2+2 18 19dev_dependencies: 20 flutter_test: 21 sdk: flutter 22 build_runner: 23 freezed: 24 pedantic_mono: any 25 26flutter: 27 uses-material-design: true

補足情報(FW/ツールのバージョンなど)

Flutter 1.24.0-3.0.pre • channel dev
Dart 2.11.0 (build 2.11.0-242.0.dev)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

https://www.virment.com/catch-app-cycle-flutter/ を参考にし、
WidgetsBindingObserverクラスでアクティブ判定を解決しました。

投稿2021/01/20 07:28

copp

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問