flutter 即使呼叫不同的路由,也会弹出报警对话框

ar5n3qh5  于 2023-01-09  发布在  Flutter
关注(0)|答案(2)|浏览(106)

我有一个简单的Flutter应用程序,有两个屏幕。在第一个屏幕上,我有一个警报对话框,每次用户访问屏幕时都会弹出。

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

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

/// The route configuration.
final GoRouter _router = GoRouter(
  routes: <RouteBase>[
    GoRoute(
      path: '/',
      builder: (BuildContext context, GoRouterState state) {
        return const HomeScreen();
      },
      routes: <RouteBase>[
        GoRoute(
          path: 'details',
          builder: (BuildContext context, GoRouterState state) {
            return const DetailsScreen();
          },
        ),
      ],
    ),
  ],
);

/// The main app.
class MyApp extends StatelessWidget {
  /// Constructs a [MyApp]
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routeInformationProvider: _router.routeInformationProvider,
      routeInformationParser: _router.routeInformationParser,
      routerDelegate: _router.routerDelegate);
  }
}

/// The home screen
class HomeScreen extends StatefulWidget {
  /// Constructs a [HomeScreen]
  const HomeScreen({Key? key}) : super(key: key);

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  

  @override
  void initState() {
    Timer(const Duration(seconds : 1), (() {
      showDialog(
        context: context, 
        builder: (context) {
          return someDialogy();
          
        });
        print('i have been called forth');
    }));
  
    super.initState();
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Home Screen')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () => context.go('/details'),
              child: const Text('Go to the Details screen'),
            ),
          ],
        ),
      ),
    );
  }
}

/// The details screen
class DetailsScreen extends StatelessWidget {
  /// Constructs a [DetailsScreen]
  const DetailsScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Details Screen')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <ElevatedButton>[
            ElevatedButton(
              onPressed: () => context.go('/'),
              child: const Text('Go back to the Home screen'),
            ),
          ],
        ),
      ),
    );
  }
}

Widget someDialogy () {
  return AlertDialog(
    content: Center(
      child: Text('data'),
    ),

  );
}

当我尝试使用网页上的超链接(如http://localhost/secondscreen)导航到第二个屏幕时,第一个屏幕的弹出窗口出现了。我猜flutter在构建路由堆栈时调用了第一个页面的initstate,它确实显示了我的弹出窗口。什么是最好的方法来绕过这个问题,同时保持第一个页面被调用时显示的弹出窗口?

nhhxz33t

nhhxz33t1#

在此显示一些模式代码会很有帮助,例如somedalogy()方法
无论如何,我怀疑这个问题可能是与您的路由解决方案,尝试

onPressed: () {
        // Navigate to the second route when the button is pressed
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondRoute()),
        );
      },
n9vozmp4

n9vozmp42#

我认为这一切都与计时器有关。试试这个:

Future.delayed(Duration(seconds: 1), () {
 showDialog(
    context: context, 
    builder: (context) {
      return someDialogy();
    });});

阅读本文了解更多关于定时器Understanding Flutter’s Timer class and Timer.periodic的信息
这个2 Types of Flutter Delay Widgets

相关问题