Flutter 如何在Flatter中的应用程序启动时显示弹出窗口

Flutter 如何在Flatter中的应用程序启动时显示弹出窗口,flutter,Flutter,我想在Flatter中添加一个应用程序加载弹出窗口(或者说每次用户打开应用程序时)。有人能帮我吗?我知道我必须使用AlertDialog小部件,但我找不到确定应用程序启动触发器的适当条件 非常感谢您的帮助。有许多选项可用于制作对话框或其他内容 您可以使用Alert Dialog、Dialog Awesome等 但如果您想创建自定义对话框或类似的东西,则可以使用Overlay小部件 检查链接: 还有教程:在initState方法中调用dailog(从主页或statup页): 你可以用 启动应用程序

我想在Flatter中添加一个应用程序加载弹出窗口(或者说每次用户打开应用程序时)。有人能帮我吗?我知道我必须使用AlertDialog小部件,但我找不到确定应用程序启动触发器的适当条件


非常感谢您的帮助。

有许多选项可用于制作对话框或其他内容

您可以使用Alert Dialog、Dialog Awesome等

但如果您想创建自定义对话框或类似的东西,则可以使用Overlay小部件

检查链接:


还有教程:

在initState方法中调用dailog(从主页或statup页):

你可以用

启动应用程序时,从shared pref(例如:isFirstLoaded)获取值。如果isFirstLoaded==true,则显示对话框

当对话框关闭时,将isFirstLoaded设置为false并保存到共享首选项

下面是一个示例(请注意,当点击Back键时,该示例不会处理Disclose事件)

将共享_首选项添加到pubspec.yaml

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

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

class MyStatelessApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Stateless Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: StatelessWidgetDemo(),
    );
  }
}

class StatelessWidgetDemo extends StatelessWidget {
  final keyIsFirstLoaded = 'is_first_loaded';

  @override
  Widget build(BuildContext context) {
    Future.delayed(Duration.zero, () => showDialogIfFirstLoaded(context));
    return SafeArea(
        child: Scaffold(
            appBar: AppBar(
              title: Text('Flutter Stateless Demo'),
            ),
            body: Center(
              child: Text('Hello'),
            )));
  }

  showDialogIfFirstLoaded(BuildContext context) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool isFirstLoaded = prefs.getBool(keyIsFirstLoaded);
    if (isFirstLoaded == null) {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          // return object of type Dialog
          return AlertDialog(
            title: new Text("Title"),
            content: new Text("This is one time dialog"),
            actions: <Widget>[
              // usually buttons at the bottom of the dialog
              new FlatButton(
                child: new Text("Dismiss"),
                onPressed: () {
                  // Close the dialog
                  Navigator.of(context).pop();
                  prefs.setBool(keyIsFirstLoaded, false);
                },
              ),
            ],
          );
        },
      );
    }
  }

导入'dart:async';
进口“包装:颤振/材料.省道”;
导入“package:shared_preferences/shared_preferences.dart”;
void main(){
runApp(MyStatelessApp());
}
类MyStatelessApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振无状态演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:无状态WidgetDemo(),
);
}
}
类无状态WidgetDemo扩展了无状态小部件{
final keyIsFirstLoaded='is_first_loaded';
@凌驾
小部件构建(构建上下文){
Future.delayed(Duration.zero,()=>showDialogIfFirstLoaded(context));
返回安全区(
孩子:脚手架(
appBar:appBar(
标题:文本(“颤振无状态演示”),
),
正文:中(
child:Text('Hello'),
)));
}
showDialogIfFirstLoaded(BuildContext上下文)异步{
SharedReferences prefs=等待SharedReferences.getInstance();
bool isfirstload=prefs.getBool(keyisfirstload);
如果(isFirstLoaded==null){
显示对话框(
上下文:上下文,
生成器:(BuildContext上下文){
//返回对话框类型的对象
返回警报对话框(
标题:新文本(“标题”),
内容:新文本(“这是一次性对话框”),
行动:[
//通常是对话框底部的按钮
新扁平按钮(
子项:新文本(“驳回”),
已按下:(){
//关闭对话框
Navigator.of(context.pop();
prefs.setBool(keyIsFirstLoaded,false);
},
),
],
);
},
);
}
}
类MyWidget扩展无状态Widget{
bool firstBuild=true;
//显示打开对话框方法
_showOpenDialog(上下文){
显示对话框(
上下文:上下文,
生成器:(上下文){
返回对话框();
});
}
@凌驾
小部件构建(构建上下文){
WidgetsBinding.instance.addPostFrameCallback((){
如果(首次构建){
firstBuild=false;
_showOpenDialog(上下文);
}
});
返回文本(“你好,世界!”);
}
}

但如何找到应用程序启动条件/触发器?调用initstate内的对话框您可以使用未来的操作来确定数据状态。它不会在每次我导航到小部件时加载!我想要的是一次性结果,即用户在加载应用程序时看到弹出窗口,他/她将在下次访问时再次看到。我希望我清楚。B但我不想在每次构建页面时都显示弹出窗口。我想在应用程序启动时显示一次。对于我的下一次应用程序运行,我看不到弹出窗口。这正是您想要的,对吗?如果不是,则您必须在打开应用程序时重置共享首选项的实例,因此只有在出现“退出”警告时才会调用它:
/applicationions/flatter/.pub cache/hosted/pub.flatter io.cn/shared_preferences-0.5.12+4/android/src/main/java/io/flatter/plugins/SharedReferences/MethodCallHandlerImpl.java:9:警告:[弃用]android.os中的异步任务已弃用
,使用我的设置:
flatter(Channel dev,1.26.0-12.0.pre,在Mac OS X 10.15.7 19H15 darwin-x64上,locale en CN)
在这种情况下,每次小部件渲染时都会正确显示对话框,还是我遗漏了什么?我想在应用程序启动时显示一次。仅在小部件的第一次渲染时显示。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

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

class MyStatelessApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Stateless Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: StatelessWidgetDemo(),
    );
  }
}

class StatelessWidgetDemo extends StatelessWidget {
  final keyIsFirstLoaded = 'is_first_loaded';

  @override
  Widget build(BuildContext context) {
    Future.delayed(Duration.zero, () => showDialogIfFirstLoaded(context));
    return SafeArea(
        child: Scaffold(
            appBar: AppBar(
              title: Text('Flutter Stateless Demo'),
            ),
            body: Center(
              child: Text('Hello'),
            )));
  }

  showDialogIfFirstLoaded(BuildContext context) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    bool isFirstLoaded = prefs.getBool(keyIsFirstLoaded);
    if (isFirstLoaded == null) {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          // return object of type Dialog
          return AlertDialog(
            title: new Text("Title"),
            content: new Text("This is one time dialog"),
            actions: <Widget>[
              // usually buttons at the bottom of the dialog
              new FlatButton(
                child: new Text("Dismiss"),
                onPressed: () {
                  // Close the dialog
                  Navigator.of(context).pop();
                  prefs.setBool(keyIsFirstLoaded, false);
                },
              ),
            ],
          );
        },
      );
    }
  }