3秒間フラッターでスプラッシュ画面を表示し、次にログイン画面に進む方法。
カウントダウンタイマーを試しましたが、インポートは未解決です
import 'package: countDown/countDown.Dart';
CountDown cd = new CountDown(new Duration(seconds: 4));
CountDown is unresolved
Android StudioとFlutter
すべてのアプリで使用するシンプルなソリューション。
ビルドメソッドのコードスニペットでTimer
クラスを使用する
class SplashScreen extends StatefulWidget {
@override
Splash createState() => Splash();
}
class Splash extends State<SplashScreen> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
Timer(
Duration(seconds: 3),
() =>
Navigator.of(context).pushReplacement(MaterialPageRoute(
builder: (BuildContext context) => LandingScreen())));
var assetsImage = new AssetImage(
'images/new_logo.png'); //<- Creates an object that fetches an image.
var image = new Image(
image: assetsImage,
height:300); //<- Creates a widget that displays an image.
return MaterialApp(
home: Scaffold(
/* appBar: AppBar(
title: Text("MyApp"),
backgroundColor:
Colors.blue, //<- background color to combine with the picture :-)
),*/
body: Container(
decoration: new BoxDecoration(color: Colors.white),
child: new Center(
child: image,
),
), //<- place where the image appears
),
);
}
}
下記参照main.Dart
import 'Dart:async';
import 'package:flutter/material.Dart';
import 'src/login_screen.Dart';
void main() {
runApp(new MaterialApp(
home: new MyApp(),
));
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
new Future.delayed(
const Duration(seconds: 3),
() => Navigator.Push(
context,
MaterialPageRoute(builder: (context) => LoginScreen()),
));
}
@override
Widget build(BuildContext context) {
return new Scaffold(
backgroundColor: Colors.white,
body: Container(
child: new Column(children: <Widget>[
Divider(
height: 240.0,
color: Colors.white,
),
new Image.asset(
'assets/logo.png',
fit: BoxFit.cover,
repeat: ImageRepeat.noRepeat,
width: 170.0,
),
Divider(
height: 105.2,
color: Colors.white,
),
]),
),
);
}
}
これがあなたに役立つことを願っています
Future.delayed
を使用すると、遅延してコードを実行できます
new Future.delayed(const Duration(seconds: 3), () {
Navigator.pushNamed(context, '/login');
});
更新
const delay = 3;
widget.countdown = delay;
StreamSubscription sub;
sub = new Stream.periodic(const Duration(seconds: 1), (count) {
setState(() => widget.countdown--);
if(widget.countdown <= 0) {
sub.cancel();
Navigator.pushNamed(context, '/login');
}
});
Future.delayed
は良い解決策ですなしカウントダウン。
ただし、カウントダウンがある場合は、Flutterが提供するアニメーションフレームワークを使用できます。
その背後にあるアイデアは、3秒間のAnimationController
を使用することです。 splashScreenがインスタンス化されるとすぐにアニメーションを開始します。アニメーションの終了時に/login
にリダイレクトするリスナーを追加します。
次に、そのコントローラーをAnimationBuilder
に渡し、animationController.lastElaspedDuration
に基づいてカウントダウンのフォーマットを処理します。
class SplashScreen extends StatefulWidget {
final Duration duration;
const SplashScreen({this.duration});
@override
_SplashScreenState createState() => new _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin {
AnimationController animationController;
@override
void initState() {
animationController = new AnimationController(duration: widget.duration, vsync: this)
..forward()
..addStatusListener((status) {
if (status == AnimationStatus.completed) {
Navigator.pushReplacementNamed(context, '/login');
}
});
super.initState();
}
@override
Widget build(BuildContext context) {
return new AnimatedBuilder(
animation: animationController,
builder: (context, _) {
return new Center(
child: new Text(animationController.lastElapsedDuration.inSeconds.toString()),
);
},
);
}
}
この回答は、flutter-redux
を使用している場合にのみ適用されます。
flutter-redux
とともに、ロード画面を表示するにはredux-persist
ライブラリを使用する必要があります。
redux-persist
は、アプリの状態を保存、再水和するために使用されます。
例:
1.main.Dart
import 'package:flutter/material.Dart';
import 'package:flutter/foundation.Dart';
import 'package:flutter_redux/flutter_redux.Dart';
import 'package:redux_persist_flutter/redux_persist_flutter.Dart';
import 'package:flutter_redux_starter/presentation/platform_adaptive.Dart';
import 'package:flutter_redux_starter/screens/loading_screen.Dart';
import 'package:flutter_redux_starter/store/store.Dart';
import 'package:flutter_redux_starter/middleware/middleware.Dart';
import 'package:flutter_redux_starter/models/app_state.Dart';
import 'package:flutter_redux_starter/routes.Dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
final store = createStore();
MyApp();
@override
Widget build(BuildContext context) {
return new PersistorGate(
persistor: persistor,
loading: new LoadingScreen(),
builder: (context) => new StoreProvider<AppState>(
store: store,
child: new MaterialApp(
title: 'Flutter test App',
theme: defaultTargetPlatform == TargetPlatform.iOS
? kIOSTheme
: kDefaultTheme,
routes: getRoutes(context, store),
initialRoute: '/login',
)
),
);
}
}
2.store.Dart
import 'package:redux/redux.Dart';
import 'package:flutter_redux_starter/reducers/app_reducer.Dart';
import 'package:flutter_redux_starter/models/app_state.Dart';
import 'package:flutter_redux_starter/middleware/middleware.Dart';
Store<AppState> createStore() {
Store<AppState> store = new Store(
appReducer,
initialState: new AppState(),
middleware: createMiddleware(),
);
persistor.start(store);
return store;
}
CreateStoreでは、Future.delayedを使用して、ストアの作成を特定の秒数だけ遅らせることができます。
new Future.delayed(const Duration(seconds: 3), () {
//
});
initState
でFuture.delayed
コンストラクタを使用できます。これにより、ナビゲーションが発生する前に、指定した期間SplashScreenが維持されます。
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => new _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState (){
super.initState();
// TODO initial state stuff
new Future.delayed(const Duration(seconds: 4));
}
@override
Widget build(BuildContext context) {
//build
}
}
私は回答をコピーしただけです: これ
スタック(スプラッシュスクリーン)から古いアクティビティをクリアする必要があると思うので、pushNamedAndRemoveUntil
のみを使用する代わりに、 pushNamed
を使用する必要があります。
new Future.delayed(const Duration(seconds: 3), () {
Navigator.pushNamedAndRemoveUntil(context, '/login', ModalRoute.withName('/'));
});