首页 > 解决方案 > 在 Flutter 中导航后打开模态或对话框

问题描述

调用 Navigator pushReplacement 后,我​​到达一个屏幕,我想在屏幕加载后自动打开一个模式或对话框。我正在尝试在 initState() 中使用 Timer.run 来做到这一点,但它不起作用,它也没有显示任何错误。谁能帮我理解我在这里错过了什么?

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dart:async';

class AfterSplash extends StatefulWidget {
  @override
  _AfterSplashState createState() => _AfterSplashState();
}

class _AfterSplashState extends State<AfterSplash> {
  void initState() {
    super.initState();
    Timer.run(() {
      showDialog(
        context: context,
        builder: (_) => AlertDialog(title: Text("Dialog title")),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return opacityLogoTitle();
  }
}

Widget opacityLogoTitle() {
  return Scaffold(
    body: Opacity(
      opacity: 0.5,
      child: Scaffold(
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Center(
              child: Padding(
                padding: const EdgeInsets.all(20.0),
                child: Container(
                  child: Image(image: AssetImage('assets/images/main.png')),
                ),
              ),
            ),
            Text(
              'Sample App',
              style: TextStyle(
                fontFamily: 'SF Pro Display',
                fontSize: 60,
                color: Color.fromRGBO(105, 121, 248, 1),
              ),
            ),
          ],
        ),
      ),
    ),
  );
}

标签: fluttermodal-dialog

解决方案


这是我的测试代码和你的代码。
它运作良好。
在此处输入图像描述

import 'dart:async';

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      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> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: AfterSplash(),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class AfterSplash extends StatefulWidget {
  @override
  _AfterSplashState createState() => _AfterSplashState();
}

class _AfterSplashState extends State<AfterSplash> {
  void initState() {
    super.initState();
    Timer.run(() {
      showDialog(
        context: context,
        builder: (_) => AlertDialog(title: Text("Dialog title")),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return opacityLogoTitle();
  }
}

Widget opacityLogoTitle() {
  return Scaffold(
    body: Opacity(
      opacity: 0.5,
      child: Scaffold(
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Center(
              child: Padding(
                padding: const EdgeInsets.all(20.0),
                child: Container(child: Text('asdf')),
              ),
            ),
            Text(
              'Sample App',
              style: TextStyle(
                fontFamily: 'SF Pro Display',
                fontSize: 60,
                color: Color.fromRGBO(105, 121, 248, 1),
              ),
            ),
          ],
        ),
      ),
    ),
  );
}

推荐阅读