flutter - 如何在 Flutter 中创建工作侧边栏
问题描述
最近我正在关注一个人的速度代码并完成它。
然后我看到代码“appBar”正在使用一个类的代码截图。它与我找到的任何教程都不同,所以我修改了类以添加侧边栏(抽屉),它工作正常但有一个问题。
侧边栏在底层,主体在二楼。你会明白下面的截图
这是主屏幕代码:
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
String _country = 'ID';
@override
Widget build(BuildContext context) {
final screenHeight = MediaQuery.of(context).size.height;
return Scaffold(
appBar: CustomAppBar(),
body: CustomScrollView(
physics: ClampingScrollPhysics(),
slivers: <Widget>[
_buildHeader(screenHeight),
_buildPreventionTips(screenHeight),
_buildYourOwnTest(screenHeight),
],
),
);
}
这是 custombarapp 代码
import 'package:flutter/material.dart';
import 'package:covid_19_master/config/palette.dart';
class CustomAppBar extends StatelessWidget with PreferredSizeWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('this is appbar'),
backgroundColor: Palette.primaryColor,
elevation: 0.0,
),
drawer: Drawer(
child: ListView(
children: <Widget>[
DrawerHeader(child: Text('ini header ya')),
ListTile(
title: Text('ini listnya'),
),
ListTile(
title: Text('ini listnya'),
),
ListTile(
title: Text('ini listnya'),
),
ListTile(
title: Text('ini listnya'),
),
],
),
),
);
}
@override
Size get preferredSize => Size.fromHeight(kToolbarHeight);
}
解决方案
问题在于您的CustomAppBar()
,它有自己的Scaffold()
,它属于Scaffold()
您的父类中的另一个HomeScreen()
。避免这种事情,因为Flutter StatefulWidget 不能有嵌套的 Scaffolds
不要让事情变得复杂。而是将您的AppBar()
andDrawer()
用于同一HomePage
本身,分别具有属性AppBar()
和Drawer()
。然后在您的视图中使用它。
主页
看看评论以获得全貌,你会很好:)
class _HomeScreenState extends State<HomeScreen> {
String _country = 'ID';
// Appbar code with Appbar Data Type
Appbar _customAppBar() => AppBar(
title: Text('this is appbar'),
backgroundColor: Palette.primaryColor,
elevation: 0.0,
);
// Drawer widget with Drawer property
Drawer _customDrawer() => Drawer(
child: ListView(
children: <Widget>[
DrawerHeader(child: Text('ini header ya')),
ListTile(
title: Text('ini listnya'),
),
ListTile(
title: Text('ini listnya'),
),
ListTile(
title: Text('ini listnya'),
),
ListTile(
title: Text('ini listnya'),
)
]
)
);
@override
Widget build(BuildContext context) {
final screenHeight = MediaQuery.of(context).size.height;
return Scaffold(
// use it here with Preferred size
appBar: PreferredSizeWidget(
preferredSize: Size.fromHeight(kToolbarHeight),
child: _customAppBar() // your appabr
),
// your drawer
drawer: _customDrawer(),
body: CustomScrollView(
physics: ClampingScrollPhysics(),
slivers: <Widget>[
_buildHeader(screenHeight),
_buildPreventionTips(screenHeight),
_buildYourOwnTest(screenHeight),
],
),
);
}
}
推荐阅读
- rust - 如何将汇编内联到文件范围内传递 Rust 定义的常量?
- json - Jmeter:我正在使用 Json 提取器从 Json 响应中传递值,但我没有在调试采样器中看到该值
- javascript - a['map'](b) 这个 Javascript 语法是如何工作的,它叫什么?
- rsa - Wolfram 可以分解 300 位 RSA 号码吗?
- c++ - 试图将指向对象的指针数组传递给 C++ 中另一个类的函数(不允许使用向量)
- reactjs - 错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。使用 useEffect 时
- hacklang - 如何在hacklang中迭代形状的字段?
- java - 计算的 BigDecimal 值返回正确的值,但在数字上添加额外的零
- r - tidyverse 加载早期版本的 dplyr
- arrays - Qsort 动态分配的数字数组