Flutter解决TabBar顶部页面切换导致页面重载问题

问题描述

写蓝牙程序时,使用到了顶部Tab的切换,但是切换过程中读取到的内容会被重置。影响体验。

解决方法

看的该博主的方法

借鉴博主链接

1、保证自己使用的是动态的StatefulWidget
2、状态继承AutomaticKeepAliveClientMixin
3、重写get wantKeepAlive方法,并返回true

代码展示

1、父页面代码展示

csharp 复制代码
import 'package:flutter/material.dart';
import 'package:tabbarsaveinfo/tabs/mypage1.dart';
import 'package:tabbarsaveinfo/tabs/mypage2.dart';

import 'mypage3.dart';

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

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      //appBar: AppBar(),
      body: DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: AppBar(
            title: Text("tabs Demo"),
            bottom: const TabBar(tabs: [
              Tab(
                text: "page1",
              ),
              Tab(
                text: "page2",
              ),
              Tab(
                text: "page3",
              ),
            ]),
          ),
          body: TabBarView(children: [
            MyPage1(),
            MyPage2(),
            MyPage3(),
          ]),
        ),
      ),
    );
  }
}

2、子页面代码展示

csharp 复制代码
import 'package:flutter/material.dart';

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

  @override
  State<MyPage1> createState() => _MyPage1State();
}

class _MyPage1State extends State<MyPage1> with AutomaticKeepAliveClientMixin {
  TextEditingController _controller = TextEditingController();
  @override
  bool get wantKeepAlive => true;
  void add() {
    setState(() {
      _controller.text = 10.toString();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
          child: Column(
        children: [
          Center(
            child: Text("第1页面的内容"),
          ),
          TextField(
            controller: _controller,
          ),
          ElevatedButton(
              onPressed: () {
                add();
              },
              child: Text("按钮1"))
        ],
      )),
    );
  }
}

添加内容圈出来了

每一个tab页面都需要加上这些内容,有几个页面加几个。

相关推荐
ShineWinsu5 分钟前
对于 Vue 3:从为什么学 Vue,到声明式渲染与数据响应式的解析
前端·javascript·vue.js
张文是假的啊11 分钟前
IOC依赖注入问题:@Primary 和 @Qualifier的使用
android
换元不配限33 分钟前
ConstraintLayout核心用法详解(三):引导线、屏障、组和占位
android·placeholder·barrier·约束布局·guideline
leoZ2312 小时前
第 6 篇:SchemaForm 渲染器核心实现
前端·javascript·vue.js·人工智能·神经网络·机器学习·自然语言处理
心平气和量大福大2 小时前
android studio(AS)工具-调试-统计总行数
android·ide·android studio
CoderYanger2 小时前
前端基础——JavaScript(基础语法)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
还是大剑师兰特2 小时前
vue项目浏览器版本判别,低于IE11跳转到新页面
前端·javascript·vue.js
想吃火锅10053 小时前
【leetcode】42.接雨水js
开发语言·javascript·ecmascript
坚果的博客3 小时前
Flutter 三方库 phone_state 的 OpenHarmony 适配实战
flutter
你的坚定3 小时前
SurfaceFlinger合成一帧的完整流程
android