Flutter路由

news2024/9/27 15:26:37

路由作为一种页面切换的能力,非常重要。Flutter 中路由管理有几个重要的点。

Navigator 1.0:Flutter 早期路由系统,侧重于移动端 ,命令式编程风格,使用 Navigator.push() 和 Navigator.pop() 等方法来管理路由栈。

Navigator 2.0:Flutter1.22 版本以后新增,侧重于桌面端/网页端,声明式编程风格,使用 Router 和 RouteInformationParser 等类来描述和管理路由树。

Flutter路由重要的类

1.Route:应用程序页面的抽象, Navigator 管理 Route。

2.Navigator:负责路由管理的重要类,通过 push 和 pop 进行页面跳转。

Flutter 跳转方式

动态路由

适于单次导航的场景,直接在代码中创建和导航的路由。

Navigator.push(context,
    MaterialPageRoute(builder: (context) => RouterPageA()));

   Navigator.pop(context);
import 'package:flutter/material.dart';

import 'dart_test_router1.dart';

class TestRouterPage extends StatelessWidget {
  const TestRouterPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test Navigator"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text("Test MaterialPageRoute"),
            ElevatedButton(
              onPressed: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) => RouterPageA()));
              },
              child: Text("Click ElevatedButton"),
              style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.blue,
                  foregroundColor: Colors.white,
                  elevation: 10,
                  minimumSize: Size(double.infinity, 50),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
            )
          ],
        ),
      ),
    );
  }
}
import 'package:flutter/material.dart';

class RouterPageA extends StatelessWidget {
  const RouterPageA({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("RouterPageA"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text("Test Navigator.pop"),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: Text("Click ElevatedButton"),
              style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.blue,
                  foregroundColor: Colors.white,
                  elevation: 10,
                  minimumSize: Size(double.infinity, 50),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
            )
          ],
        ),
      ),
    );
  }
}

Navigator.push有两个参数,一个是BuildContext,另一个是Route。代码中使用的是MaterialPageRoute,执行与对应平台风格一致的切换动画(android 与 ios平台不同)。如果使用 CupertinoPageRoute,页面切换效果是左右滑动。

PageRoute可以自定义,实现自定义页面切换的动画和行为。如果想自定义下过渡动画,使用 PageRouteBuilder 创建自定义路由,通过 pageBuilder 和 transitionsBuilder 属性来定义页面和过渡动画。

通过 pageBuilder 实现页面渐入动画

                Navigator.of(context).push(PageRouteBuilder(
                    pageBuilder: (context, animation, secondaryAnimation) {
                  return FadeTransition(
                      opacity: animation, child: const RouterPageA());
                }));

pageBuilder + transitionsBuilder 实现过渡动画


                Navigator.of(context).push(PageRouteBuilder(
                    pageBuilder: (context, animation, secondaryAnimation) =>
                        const RouterPageA(),
                    transitionsBuilder:
                        (context, animation, secondaryAnimation, child) {
                     //动画的起始位置,轴y方向屏幕下侧偏移起点
                      var start = const Offset(0, 1);
                     //动画的结束位置,0表示没有偏移
                      var end = Offset.zero;
                      //动画曲线,easeInOut 表示开始慢,中间加速,结束慢
                      var curve = Curves.easeInOut;
                      // 创建一个从begin到end的补间动画,.chain 表示与曲线结合
                      var tween = Tween(begin: start, end: end)
                          .chain(CurveTween(curve: curve));
                       // SlideTransition 是一个动画Widget
                      return SlideTransition(
                          position: animation.drive(tween), child: child);
                    }));

 静态路由

静态路由需要提前注册,首先给每个路由定义一个名称,通过这个名称来导航到对应的路由。

在应用根级别 (MaterialApp 或者 CupertinoApp ) 中定义路由,使用routes参数将路由名称映射到对应的Widget。

不带参数与返回值案例

Navigator.of(context).pushNamed("/dart_test_router1");
import 'package:flutter/material.dart';

import 'dart_test_router1.dart';

class TestStaticRouterPage extends StatelessWidget {
  const TestStaticRouterPage({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Test Router Demo",
      theme: ThemeData(
        useMaterial3: false,
        primarySwatch: Colors.blue,
        textButtonTheme: const TextButtonThemeData(
          
          style: ButtonStyle(splashFactory: NoSplash.splashFactory),
        ),
      ),
      home: const RealTestStaticRouterPage(),
      routes: {
      //  "/": (context) => const RealTestStaticRouterPage(),
        "/dart_test_router1": (context) => const RouterPageA()
      },
     // initialRoute: "/",
    );
  }
}

class RealTestStaticRouterPage extends StatelessWidget {
  const RealTestStaticRouterPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("TEST STATIC ROUTER PAGE"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text("Test Static Router Page"),
            ElevatedButton(
              onPressed: () {
                Navigator.of(context).pushNamed("/dart_test_router1");
              },
              child: Text("Click ElevatedButton"),
              style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.blue,
                  foregroundColor: Colors.white,
                  elevation: 10,
                  minimumSize: Size(double.infinity, 50),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
            )
          ],
        ),
      ),
    );
  }

带参数与返回值

import 'package:flutter/material.dart';

import 'dart_test_router1.dart';
import 'dart_test_router3.dart';

class TestStaticRouterPage extends StatelessWidget {
  const TestStaticRouterPage({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Test Router Demo",
      theme: ThemeData(
        useMaterial3: false,
        primarySwatch: Colors.blue,
        textButtonTheme: const TextButtonThemeData(
          // 鍘绘帀 TextButton 鐨勬按娉㈢汗鏁堟灉
          style: ButtonStyle(splashFactory: NoSplash.splashFactory),
        ),
      ),
      home: const RealTestStaticRouterPage(),
      routes: {
        //  "/": (context) => const RealTestStaticRouterPage(),
        "/dart_test_router1": (context) => const RouterPageA(),
        "/dart_test_router3": (context) => const RouterPage3()
      },
      // initialRoute: "/",
    );
  }
}

class RealTestStaticRouterPage extends StatelessWidget {
  const RealTestStaticRouterPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("TEST STATIC ROUTER PAGE"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text("Test Static Router Page"),
            ElevatedButton(
              onPressed: () async {
                var result = await Navigator.of(context).pushNamed(
                    "/dart_test_router3",
                    arguments: {"title": "Hello"});
                print(result);
              },
              child: Text("Click ElevatedButton"),
              style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.blue,
                  foregroundColor: Colors.white,
                  elevation: 10,
                  minimumSize: Size(double.infinity, 50),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
            )
          ],
        ),
      ),
    );
  }
import 'package:flutter/material.dart';

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

  @override
  State<StatefulWidget> createState() {
    return _RouterPage3State();
  }
}

class _RouterPage3State extends State<RouterPage3> {
  @override
  Widget build(BuildContext context) {
    var args =
        ModalRoute.of(context)?.settings.arguments as Map<String, dynamic>?;
    final title = args?['title'] ?? "DEFAULT TITLE";

    return Scaffold(
      appBar: AppBar(
        title: Text("RouterPageA"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("GET TITLE===========銆?title"),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context, "I went from RouterPage3");
              },
              child: Text("Click ElevatedButton"),
              style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.blue,
                  foregroundColor: Colors.white,
                  elevation: 10,
                  minimumSize: Size(double.infinity, 50),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
            )
          ],
        ),
      ),
    );
  }
}

 

2024-09-12 10:01:46.569 25438-25629 flutter  I  I went from RouterPage3

路由操作

路由替换

像登录页跳首页的场景,我们希望页面跳转成功后,回到上上个页面。我们可以通过pushReplacement、pushReplacementNamed实现。

API一:动态路由替换

Navigator.of(context).pushReplacement(
                    MaterialPageRoute(builder: (context) => RouterPageA()));

API二:静态路由替换

         var result = await Navigator.of(context).pushReplacementNamed(
                    "/dart_test_router3",
                    arguments: {"title": "Hello"});

新路由入栈+移除之前的路由,直到条件满足

pushAndRemoveUntil 将给定路由推送给Navigator,删除先前的路由,直到该函数的参数predicate返回true为才停止。

import 'package:flutter/material.dart';

import 'dart_test_router1.dart';
import 'dart_test_router3.dart';

class TestRouterPage4 extends StatelessWidget {
  const TestRouterPage4({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Test pushAndRemoveUntil",
      theme: ThemeData(
          useMaterial3: false,
          primarySwatch: Colors.blue,
          textButtonTheme: const TextButtonThemeData(
            style: ButtonStyle(splashFactory: NoSplash.splashFactory),
          )),
      home: const RealTestRouterPage4(),
    );
  }
}

class RealTestRouterPage4 extends StatelessWidget {
  const RealTestRouterPage4({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test pushAndRemoveUntil"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text("test pushAndRemoveUntil"),
              ElevatedButton(
                onPressed: () {
                  Navigator.pushAndRemoveUntil(
                      context,
                      MaterialPageRoute(builder: (context) => RouterPageA()),
                      (Route<dynamic> route) => route.isFirst);
                },
                child: Text("Click ElevatedButton"),
                style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.blue,
                    foregroundColor: Colors.white,
                    elevation: 10,
                    minimumSize: Size(double.infinity, 50),
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10))),
              )
            ]),
      ),
    );
  }
}

这个方式是跳转到某个页面,然后移除路由直到...为止

路由出栈,直到条件满足

在flutter 路由跳转中,我们想要回到特定的一个页面 比如:从 A -> B-> C ->D,我们向从 D页面 pop至 B 页面。我们可以使用 popUtil方法回到 B 页面。

popUntil 反复执行pop 直到该函数的参数predicate返回true为止。

import 'package:flutter/material.dart';

import 'dart_test_router6.dart';

class TestRouterPage5 extends StatelessWidget {
  const TestRouterPage5({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Test popUntil TestRouterPage5",
      theme: ThemeData(
          useMaterial3: false,
          primarySwatch: Colors.blue,
          textButtonTheme: const TextButtonThemeData(
            style: ButtonStyle(splashFactory: NoSplash.splashFactory),
          )),
      home: const RealTestRouterPage5(),
    );
  }
}

class RealTestRouterPage5 extends StatelessWidget {
  const RealTestRouterPage5({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test popUntil TestRouterPage5"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text("test popUntil TestRouterPage5"),
              ElevatedButton(
                onPressed: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => TestRouterPage6()));
                },
                child: Text("Click ElevatedButton"),
                style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.blue,
                    foregroundColor: Colors.white,
                    elevation: 10,
                    minimumSize: Size(double.infinity, 50),
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10))),
              )
            ]),
      ),
    );
  }
}
import 'package:flutter/material.dart';

import 'dart_test_router7.dart';

class TestRouterPage6 extends StatelessWidget {
  const TestRouterPage6({super.key});

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

class RealTestRouterPage6 extends StatelessWidget {
  const RealTestRouterPage6({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test popUntil TestRouterPage6"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text("test popUntil TestRouterPage6"),
              ElevatedButton(
                onPressed: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => TestRouterPage7()));
                },
                child: Text("Click ElevatedButton"),
                style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.blue,
                    foregroundColor: Colors.white,
                    elevation: 10,
                    minimumSize: Size(double.infinity, 50),
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10))),
              )
            ]),
      ),
    );
  }
}
import 'package:flutter/material.dart';

class TestRouterPage7 extends StatelessWidget {
  const TestRouterPage7({super.key});

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

class RealTestRouterPage7 extends StatelessWidget {
  const RealTestRouterPage7({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test popUntil TestRouterPage7"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text("test popUntil TestRouterPage7"),
              ElevatedButton(
                onPressed: () {
                  Navigator.of(context)
                      .popUntil((Route<dynamic> route) => route.isFirst);
                },
                child: Text("Click ElevatedButton"),
                style: ElevatedButton.styleFrom(
                    backgroundColor: Colors.blue,
                    foregroundColor: Colors.white,
                    elevation: 10,
                    minimumSize: Size(double.infinity, 50),
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10))),
              )
            ]),
      ),
    );
  }
}

上面的代码中调用Navigator.of(context)
                      .popUntil((Route<dynamic> route) => route.isFirst);直接回到了 TestRouterPage5。

 

删除指定路由

获得当前路由

ModalRoute.of(context);

 移除指定路由


if (route != null) {
  Navigator.of(context).removeRoute(route);
}

移除指定路由下方的单个路由

if (route != null) {
  Navigator.of(context).removeRouteBelow(route);
}

页面传参与数据回传

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:gsy_flutter_demo/widget/dart_test_router2.dart';

import 'dart_test_router1.dart';

class TestRouterPage extends StatelessWidget {
  const TestRouterPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test Navigator"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text("Test MaterialPageRoute"),
            ElevatedButton(
              onPressed: () async {
                String backContent = await Navigator.of(context).push(MaterialPageRoute(
                    builder: (context) => RouterPage2(title: "Custom Title")));
                print(backContent);
              },
              child: Text("Click ElevatedButton"),
              style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.blue,
                  foregroundColor: Colors.white,
                  elevation: 10,
                  minimumSize: Size(double.infinity, 50),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
            )
          ],
        ),
      ),
    );
  }
}
import 'package:flutter/material.dart';

class RouterPage2 extends StatefulWidget {
  final String title;

  const RouterPage2({super.key, required this.title});

  @override
  State<StatefulWidget> createState() {
    return _RouterPage2State();
  }
}

class _RouterPage2State extends State<RouterPage2> {
  @override
  Widget build(BuildContext context) {
    var widgitTitle = widget.title;

    return Scaffold(
      appBar: AppBar(
        title: Text("RouterPageA"),
      ),
      body: Container(
        alignment: Alignment.center,
        margin: const EdgeInsets.all(10),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text("GET TITLE===========銆?widgitTitle"),
            ElevatedButton(
              onPressed: () {
                Navigator.pop(context, "I went from RouterPageA");
              },
              child: Text("Click ElevatedButton"),
              style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.blue,
                  foregroundColor: Colors.white,
                  elevation: 10,
                  minimumSize: Size(double.infinity, 50),
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(10))),
            )
          ],
        ),
      ),
    );
  }
}

2024-09-11 14:51:16.211 24765-24840 flutter I  I went from RouterPageA


 

Navigator  的工作流程

Navigator  的核心是对路由栈的管理。当你调用 Navigator.push 时,一个新的路由被创建并推入栈顶;当你调用 Navigator.pop 时,栈顶的路由被移除。

  const Navigator({
    super.key,
    this.pages = const <Page<dynamic>>[],
    this.onPopPage,
    this.initialRoute,
    this.onGenerateInitialRoutes = Navigator.defaultGenerateInitialRoutes,
    this.onGenerateRoute,
    this.onUnknownRoute,
    this.transitionDelegate = const DefaultTransitionDelegate<dynamic>(),
    this.reportsRouteUpdateToEngine = false,
    this.clipBehavior = Clip.hardEdge,
    this.observers = const <NavigatorObserver>[],
    this.requestFocus = true,
    this.restorationScopeId,
    this.routeTraversalEdgeBehavior = kDefaultRouteTraversalEdgeBehavior,
  });

Navigator.push 

#Navigator.push

  @optionalTypeArgs
  static Future<T?> push<T extends Object?>(BuildContext context, Route<T> route) {
    return Navigator.of(context).push(route);
  }

Navigator.push 调用Navigator.of(context).push(route),内部 调用NavigatorState 的 push 方法:

  @optionalTypeArgs
  Future<T?> push<T extends Object?>(Route<T> route) {
    _pushEntry(_RouteEntry(route, pageBased: false, initialState: _RouteLifecycle.push));
    return route.popped;
  }

 #NavigatorState

  void _pushEntry(_RouteEntry entry) {
    assert(!_debugLocked);
    assert(() {
      _debugLocked = true;
      return true;
    }());
    assert(entry.route._navigator == null);
    assert(entry.currentState == _RouteLifecycle.push);
    _history.add(entry);
    _flushHistoryUpdates();
    assert(() {
      _debugLocked = false;
      return true;
    }());
    _afterNavigation(entry.route);
  }

这里发生了一系列操作:

  • _history.add(route) : 将 新路由 添加到 路由栈 中。
  • route.install() : 安装路由,将页面挂载到 widget 树上。
  • route.didPush() : 通知 路由 已经被推入 栈顶 。
  • _cancelActivePointers() : 取消所有正在进行的触摸事件,防止发生意外事件。
  • route.didChange() : 通知 路由 状态发生变化。

push 方法返回一个 Future,该 Future 会在路由完成push操作时完成。

Navigator.pop

#Navigator.pop 

 Navigator.of(context).pop();
  @optionalTypeArgs
  void pop<T extends Object?>([ T? result ]) {
    assert(!_debugLocked);
    assert(() {
      _debugLocked = true;
      return true;
    }());
    final _RouteEntry entry = _history.lastWhere(_RouteEntry.isPresentPredicate);
    if (entry.pageBased) {
      if (widget.onPopPage!(entry.route, result) && entry.currentState == _RouteLifecycle.idle) {
        // The entry may have been disposed if the pop finishes synchronously.
        assert(entry.route._popCompleter.isCompleted);
        entry.currentState = _RouteLifecycle.pop;
      }
      entry.route.onPopInvoked(true);
    } else {
      entry.pop<T>(result);
      assert (entry.currentState == _RouteLifecycle.pop);
    }
    if (entry.currentState == _RouteLifecycle.pop) {
      _flushHistoryUpdates(rearrangeOverlay: false);
    }
    assert(entry.currentState == _RouteLifecycle.idle || entry.route._popCompleter.isCompleted);
    assert(() {
      _debugLocked = false;
      return true;
    }());
    _afterNavigation(entry.route);
  }
  • history.lastWhere:找到最后一个处于 “存在”状态 的路由条目。
  • entry.pageBased:路由是否是基于页面的。
  • widget.onPopPage:执行页面pop操作。
  • entry.route.onPopInvoked(true):通知路由pop操作被调用。
  • entry.pop<T>(result):直接调用pop。
  • _afterNavigation(entry.route):导航完成后回调。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

序列化流(对象操作输出流)反序列化流(对象操作输入流)

可以把Java中的对象写到本地文件中 序列化流&#xff08;对象操作输出流&#xff09; 构造方法 成员方法 使用对象输出流将对象保存到文件会出现NotSerializableException异常 解决方案&#xff1a;需要让Javabean类实现Serializable接口 Student package myio;import java.…

Claude 的上下文检索功能提升了 RAG 准确率,这会是人工智能革命?

前言 在人工智能领域不断进步的过程中&#xff0c;人们对更准确且具备上下文理解能力的响应的追求&#xff0c;催生了诸多突破性创新。 而 Claude 的上下文检索技术就是其中一项进步&#xff0c;有望显著提升检索增强生成 (RAG) 系统的表现。 可能有同学就要问了&#xff1a;…

DDL 超时,应该如何解决 | OceanBase 用户问题集萃

问题背景 在OceanBase的社区问答里常看到有用户发帖提出DDL超时的问题&#xff0c; 如“执行 DDL 超时&#xff0c;为何调大超时时间不生效&#xff1f;” 。但很多帖子的回答都没有完美解决。因此&#xff0c;这里把相关的解决思路在这里分享给大家。 帖子里对这类问题的描述…

2、 如何提高电脑运行速度 (改虚拟内存)?

改下电脑C磁盘的虚拟内存 方法如下&#xff1a; ① 按下电脑键盘上的 win E 键 &#xff0c; 然后鼠标移动到左边的【此电脑上】 然后&#xff0c;按下鼠标右键&#xff0c;选择【属性】 ② 然后&#xff0c;选择【高级系统设置】 4、选择【高级】&#xff0c;选择性能里面…

SPSS26统计分析笔记——5 卡法检验

1 卡方检验原理 卡方检验由卡尔皮尔逊&#xff08;Karl Pearson&#xff09;于1900年首次提出&#xff0c;是一种针对频数数据&#xff08;定类数据或计数数据&#xff09;的假设检验方法。它通过比较实际观测次数与理论期望次数之间的差异&#xff0c;构造出 χ 2 {\chi^2} χ…

seL4 Threads(四)

官网链接: Threads Threads 这篇教程主要是使用seL4中的threads。 TCB Thread Control Blocks seL4提供了线程代表执行的上下文以及管理处理器时间。seL4中的线程是通过线程控制块对象&#xff08;TCB&#xff09;实现的&#xff0c;每个内核线程都有一个线程控制块。 线程…

linux服务器安装原生的php环境

在CentOS上安装原生的PHP环境相对简单。下面是一个详细的步骤指南&#xff0c;适用于CentOS 7及更高版本。 ### 第一步&#xff1a;更新系统 首先&#xff0c;确保你的系统是最新的&#xff1a; sudo yum update -y ### 第二步&#xff1a;安装EPEL和Remi仓库 1. **安装EP…

Windows内核编程基础(3)

内存分配 在应用层编程时&#xff0c;系统提供了GlobalAlloc/HeapAlloc/LocalAlloc等函数。C/C库提供了malloc函数&#xff0c;以及new操作符在堆上分配内存。 在我前面一个关于Windows页交换文件的博客中&#xff0c;介绍了虚拟内存&#xff0c; 虚拟内存是计算机系统内存管…

古月居全新改版上线:AI 大模型“古月知道”引领 ROS 学习新体验

前言 古月居自成立以来&#xff0c;一直致力于为广大 ROS&#xff08;机器人操作系统&#xff09;爱好者和开发者提供优质的学习资源和社区交流平台。经过长期的用户调研和反馈&#xff0c;我们发现旧版古月居在使用过程中存在一些不便之处。 为了更好地服务大家&#xff0c;…

如何生成谷歌临时邮箱?

谷歌的Gmail作为全球最受欢迎的邮件服务之一&#xff0c;不仅因其稳定性和强大的功能而备受青睐&#xff0c;还因为它支持临时邮箱功能&#xff0c;这一功能能够极大地提升用户在各种场景下的使用灵活性。无论是处理一次性事务、注册新账户还是防止垃圾邮件&#xff0c;Gmail的…

通义模型Prompt调优的实用技巧

1. 目录 1. prompt工程简介 2. Prompt设计 2.1 Prompt主要构成要素 2.2 Prompt编写策略 策略一&#xff1a;对较难被准确遵循的复杂规则可拆分为多条规则&#xff0c;有助于提升效果 策略二&#xff1a;适当冗余关键信息 策略三&#xff1a;使用分隔符给Prompt分段 策…

类与对象—python

一、类的含义 1.1类的作用&#xff08;理解&#xff09; 收集学生信息时&#xff0c;如果让同学们自主填写&#xff0c;信息的顺序、格式不一&#xff0c;内容混乱。如果发给同学们既定的表格&#xff0c;同学们按照规定的顺序、格式进行填写&#xff0c;那信息就会一目了然&…

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SO-SVR蛇群算法优化支持向量机的数据多…

path_provider插件的用法

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…

大数据-147 Apache Kudu 常用 Java API 增删改查

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案&#xff08;如何主动屏蔽报错&#xff09; 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

开源的CDN:jsDelivr+Github加速图片加载

文章目录 20240530更新 网站加载的图片耗时&#xff0c;将图片使用jsDelivr进行加速。 每次打开静态网站的时候&#xff0c;都会发现页面的内容已经加载出来了&#xff0c;但是图片还是一片白&#xff0c;就考虑如何让图片能够更快的加载出来。 后面发现可以用jsDelivr加速Gi…

自然场景文本定位系统源码分享

自然场景文本定位检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

南京市副市长吴炜一行至天洑软件参观调研

近日&#xff0c;南京市副市长吴炜、南京市工信局副局长代吉上、南京市科技局副局长王愿华、江宁开发区管委会副主任易骏飞一行至天洑软件参观&#xff0c;调研工业软件重点企业方案&#xff0c;天洑软件副总经理冯克列、总工程师郭阳、研发部部长谢佳雯陪同调研。 Q1&#xff…

南开大学联合同济大学发布最新SOTA Occ OPUS:使用稀疏集进行占据预测,最快实现8帧22FPS

Abstract 占据预测任务旨在预测体素化的 3D 环境中的占据状态&#xff0c;在自动驾驶社区中迅速获得了关注。主流的占据预测工作首先将 3D 环境离散化为体素网格&#xff0c;然后在这些密集网格上执行分类。然而&#xff0c;对样本数据的检查显示&#xff0c;大多数体素是未占…