I use theme proviser.I try to wrap each route and dialog in ThemeConsumer, but it dont work with drower,What should i do?.
#override
Widget build(BuildContext context) {
return Scaffold(
drawer: Drawer( child: ThemeConsumer(child: SettingsPage())),
)};
Related
When I have an AppBar on my screen, it looks like this:
But I don't need AppBar so I removed it. As a result my screen looks like this:
As you can see, the top of my screen is in the StatusBar (where there are clock, Internet connection icon, and so on).
Please help me change my code so that my screen starts right after the StatusBar.
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: Container(
child: Scaffold(
// appBar: AppBar (title: const Text(_title)),
body: const MainWidget(),
),
)
);
}
Thanks in advance.
Edit 1. Why doesn't this work for the Container case? I had this code on another screen:
#override
Widget build(BuildContext context) {
return Container(
height: MediaQuery.of(context).size.height,
...
I changed it to this:
#override
Widget build(BuildContext context) {
return SafeArea(
child: Container(
height: MediaQuery.of(context).size.height,
...
But nothing has changed. Why?
Wrap your scaffold body with SafeArea widget
#override
Widget build(BuildContext context) {
return SafeArea(
For your case, do it on home or scaffold.
home: SafeArea(
More about SafeArea
my app is working fine on android but for ios its crashing ,
if i comment the AppBar , its working in ios, but with app its not working.
appBar: AppBar(), // here is the problem
#override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(), // here is the problem
backgroundColor: Colors.black,
body: SafeArea(
main.dart code,
#override
Widget build(BuildContext context) {
pushNotificationMessage();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
return MultiProvider(
providers: [
ChangeNotifierProvider<AppData>(create: (_) => AppData()),
],
child: GetMaterialApp(
title: 'ABC App',
debugShowCheckedModeBanner: false,
I think your issue here is Appbar conflicting with the non safe area in your iOS device (upper notch for example), so you can fix that by one of two ways:
First way(encouraged), you can wrap your scaffold itself in the SafeArea widget instead of the body of the scaffold:
#override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return SafeArea(
Scaffold(
key: _scaffoldKey,
appBar: AppBar(), // here is the problem
backgroundColor: Colors.black,
body: Container(
Second way, you can remove AppBar() from the scaffold and add it inside your body widget, for example:
#override
Widget build(BuildContext context) {
final screenSize = MediaQuery.of(context).size;
return Scaffold(
key: _scaffoldKey,
backgroundColor: Colors.black,
body: SafeArea(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
margin: const EdgeInsets.only(bottom: 30), child: AppBar()),
I have a global variable that is true if using Android. The code below doesn't work. How can I decide what widget to display depending on the platform:
rmoMenu is a custom widget that returns a Drawer widget
rmoBottomNavigationBar is a custom widget that returns a BottomNavigationBar widget
#override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: rmoAppBar(subText: 'My Shifts'),
if (globals.gblIsAndroid == true) then {
drawer: rmoMenu()
} else {
bottomNavigationBar: rmoBottomNavigationBar(),
},
body: ...
You can use the ternary operator:
Scaffold(
appBar: rmoAppBar(subText: 'My Shifts'),
drawer: globals.gblIsAndroid ? rmoMenu() : null,
bottomNavigationBar: !globals.gblIsAndroid ? rmoBottomNavigationBar() : null,
I am just trying to create an simple widget but it keeps showing this error what should I do?
It looks like your root widget is not MaterialApp, other widgets that you are using need to be descendants of some media query ancestor. Eg. MaterialApp.
Instead of this:
Widget build(BuildContext context) {
return Container(
child: SomeWidget(),
);
}
Make it:
Widget build(BuildContext context) {
return MaterialApp(
home: SomeWidget(),
);
}
You are getting the error because your application doesn't return a Material App. Check this code below, it works perfectly.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: Colors.redAccent,
title: Text('unit converter', textScaleFactor: 1.0,),
),
body: Container(
color: Colors.purpleAccent,
),
),
);
}
}
The output of the code:
You are getting this error because on the top of the tree a material widget should be used.
here you can use Scaffold or MaterialApp widget.
and If you are trying to paint your screen background to some color then just use the parameter backgroundColor under your Scaffold widget.
Try code shown below
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.purpleAccent,
appBar: AppBar(
backgroundColor: Colors.redAccent,
title: Text("unit converter",textScaleFactor:4.0)
),
body: yourWidget()
);
}
I want to make the drawer opened when a user navigate to the screen. How can I do it?
Widget build(BuildContext context) {
return Scaffold(
appBar: Header(),
drawer: Theme(
child: Drawer(
elevation: 0,
),
),
);
}
You need to create a GlobalKey and use it as the Scaffold's key.
Then you need to use the key to call openDrawer on state initialization.
This is the corresponding code :
GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();
#override
void initState() {
super.initState();
openDrawer();
}
openDrawer() async {
await Future.delayed(Duration.zero);
_scaffoldKey.currentState.openDrawer();
}
#override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
drawer: Drawer(
),
body: Center()
);
}