[ flutter ] flutter使用 首页路由配置, 传参

import "package:flutter/material.dart";
import "./pages/my.dart";
import "./pages/user.dart";

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

class MyHomePage extends StatelessWidget {
  MyHomePage({super.key});

  Map routes = {
    "/user": (context) => const UserPage(),
    "/my": (context, {arguments}) => MyPage(arguments: arguments)
  };

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: const Color.fromRGBO(244, 244, 244, 1),
        appBar: AppBar(
          backgroundColor: Colors.blue,
          title: const Text("首页"),
        ),
        body: const MyBody(),
      ),
      onGenerateRoute: (RouteSettings routerSetting) {
        print(routerSetting);
        Function fn = routes[routerSetting.name];
        if (fn != null) {
          if (routerSetting.arguments != null) {
            Route route = MaterialPageRoute(builder: (context) {
              return fn(context, arguments: routerSetting.arguments);
            });
            return route;
          } else {
            Route route = MaterialPageRoute(builder: (context) {
              return fn(context);
            });
            return route;
          }
        } else {
          return null;
        }
      },
    );
  }
}

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

  @override
  State<MyBody> createState() => _MyBodyState();
}

class _MyBodyState extends State<MyBody> {
  @override
  Widget build(BuildContext context) {
    return GridView.count(
        crossAxisCount: 3,
        mainAxisSpacing: 32,
        crossAxisSpacing: 32,
        padding: const EdgeInsets.all(16),
        children: const [
          GridTag(
            Icons.access_alarm_rounded,
            {"title": "我是标题"},
            path: "/my",
          ),
          GridTag(
            Icons.abc,
            {},
            path: "/user",
          ),
          GridTag(
            Icons.ac_unit,
            {},
          ),
        ]);
  }
}

class GridTag extends StatelessWidget {
  const GridTag(this.icon, this.arguments, {super.key, this.path = ""});

  final String path;
  final IconData icon;
  final Map arguments;

  @override
  Widget build(BuildContext context) {
    return AspectRatio(
        aspectRatio: 1,
        child: Container(
          decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(100), color: Colors.white),
          child: IconButton(
            onPressed: () {
              if (path?.isNotEmpty == true) {
                if (arguments?.isNotEmpty == true) {
                  Navigator.pushNamed(context, path, arguments: arguments);
                } else {
                  Navigator.pushNamed(context, path);
                }
              }
            },
            icon: Icon(icon, size: 80),
          ),
        ));
  }
}

 

posted @ 2025-07-20 21:31  深海里的星星i  阅读(11)  评论(0)    收藏  举报