Flutter页面未找到处理插件page_not_found的使用

Flutter页面未找到处理插件page_not_found的使用

开始使用

page_not_found 是一个专门为 Flutter 设计的用于显示 404 错误页面的包。它提供了可自定义的小部件,可以集成图片和 Lottie 动画。开发人员可以使用它来创建视觉上吸引人的错误页面,以增强 Web 和移动应用的用户体验。

特性通常包括:

  • 图片支持:10 种不同的 404 错误页面图片。
  • Lottie 动画:10 种不同的 Lottie 动画。

安装

要使用 page_not_found 包,请在 pubspec.yaml 文件的 dependencies 部分添加以下行:

dependencies:
  page_not_found: ^<最新版本>

404 Lottie 动画

动画 1 动画 2 动画 3 动画 4 动画 5
动画 6 动画 7 动画 8 动画 9 动画 10

使用 page_not_found 显示动画错误页面

要使用 page_not_found 包,您可以显示一个带有可定制 GIF 尺寸的动画错误页面。以下是一个示例:

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

FutureBuilder<Widget>(
  future: PageNotFound.animatedError10(
    context: context,
    gifHeight: 200.0, // 可选:根据需求自定义 gif 高度
    gifWidth: 200.0,  // 可选:根据需求自定义 gif 宽度
  ),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const Center(child: CircularProgressIndicator()); // 如果正在加载,显示进度指示器
    } else if (snapshot.hasError) {
      return Center(child: Text('Error: ${snapshot.error}')); // 如果发生错误,显示错误消息
    } else if (snapshot.hasData) {
      return snapshot.data!; // 如果成功获取数据,显示返回的数据
    } else {
      return const Center(child: Text('Something went wrong.')); // 如果其他情况,显示默认错误信息
    }
  },
),

404 错误图片

图片 1 图片 2 图片 3 图片 4 图片 5
图片 6 图片 7 图片 8 图片 9 图片 10

使用 page_not_found 显示错误图片

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

FutureBuilder<Widget>(
  future: PageNotFound.errorTemplate1(
    context: context,
  ),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const Center(child: CircularProgressIndicator()); // 如果正在加载,显示进度指示器
    } else if (snapshot.hasError) {
      return Center(child: Text('Error: ${snapshot.error}')); // 如果发生错误,显示错误消息
    } else if (snapshot.hasData) {
      return snapshot.data!; // 如果成功获取数据,显示返回的数据
    } else {
      return const Center(child: Text('Something went wrong.')); // 如果其他情况,显示默认错误信息
    }
  },
),

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 page_not_found 插件来显示动画错误页面。

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

void main() {
  runApp(const Example());
}

class Example extends StatefulWidget {
  const Example({super.key});

  [@override](/user/override)
  State<Example> createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false, // 禁用调试横幅
      home: Scaffold(
        body: FutureBuilder<Widget>(
          future: PageNotFound.animatedError10(
            context: context,
            gifHeight: 200.0,
            gifWidth: 200.0,
          ),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Center(
                child: CircularProgressIndicator(),
              );
            } else if (snapshot.hasError) {
              return Center(
                child: Text('Error: ${snapshot.error}'),
              );
            } else if (snapshot.hasData) {
              return snapshot.data!;
            } else {
              return const Center(
                child: Text('Something went wrong.'),
              );
            }
          },
        ),
      ),
    );
  }
}

更多关于Flutter页面未找到处理插件page_not_found的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter页面未找到处理插件page_not_found的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,处理页面未找到(404)的情况通常可以通过自定义路由和错误处理来实现。虽然Flutter本身没有内置的“page_not_found”插件,但你可以通过以下步骤来实现类似的功能。

1. 自定义路由

你可以使用 MaterialApponGenerateRoute 属性来自定义路由处理逻辑。当路由未找到时,可以跳转到一个自定义的“页面未找到”页面。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      // 自定义路由处理
      onGenerateRoute: (settings) {
        // 根据路由名称处理不同的页面
        switch (settings.name) {
          case '/':
            return MaterialPageRoute(builder: (context) => HomePage());
          case '/about':
            return MaterialPageRoute(builder: (context) => AboutPage());
          default:
            // 如果路由未找到,跳转到404页面
            return MaterialPageRoute(builder: (context) => NotFoundPage());
        }
      },
      initialRoute: '/',
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Text('Home Page'),
      ),
    );
  }
}

class AboutPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('About'),
      ),
      body: Center(
        child: Text('About Page'),
      ),
    );
  }
}

class NotFoundPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('404'),
      ),
      body: Center(
        child: Text('Page Not Found'),
      ),
    );
  }
}

2. 使用 onUnknownRoute

你还可以使用 MaterialApponUnknownRoute 属性来处理未知路由。当 onGenerateRoute 没有处理某个路由时,onUnknownRoute 会被调用。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      // 自定义路由处理
      onGenerateRoute: (settings) {
        switch (settings.name) {
          case '/':
            return MaterialPageRoute(builder: (context) => HomePage());
          case '/about':
            return MaterialPageRoute(builder: (context) => AboutPage());
          default:
            // 如果路由未找到,返回null,让onUnknownRoute处理
            return null;
        }
      },
      // 处理未知路由
      onUnknownRoute: (settings) {
        return MaterialPageRoute(builder: (context) => NotFoundPage());
      },
      initialRoute: '/',
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Text('Home Page'),
      ),
    );
  }
}

class AboutPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('About'),
      ),
      body: Center(
        child: Text('About Page'),
      ),
    );
  }
}

class NotFoundPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('404'),
      ),
      body: Center(
        child: Text('Page Not Found'),
      ),
    );
  }
}

3. 使用第三方插件

虽然Flutter本身没有专门的“page_not_found”插件,但你可以使用一些第三方路由管理插件,如 auto_routego_router,它们提供了更强大的路由管理功能,并且可以更容易地处理404页面。

例如,使用 go_router 处理404页面:

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

void main() {
  final router = GoRouter(
    routes: [
      GoRoute(
        path: '/',
        builder: (context, state) => HomePage(),
      ),
      GoRoute(
        path: '/about',
        builder: (context, state) => AboutPage(),
      ),
    ],
    errorBuilder: (context, state) => NotFoundPage(),
  );

  runApp(MyApp(router: router));
}

class MyApp extends StatelessWidget {
  final GoRouter router;

  MyApp({required this.router});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: router,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: Text('Home Page'),
      ),
    );
  }
}

class AboutPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('About'),
      ),
      body: Center(
        child: Text('About Page'),
      ),
    );
  }
}

class NotFoundPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('404'),
      ),
      body: Center(
        child: Text('Page Not Found'),
      ),
    );
  }
}
回到顶部