skip to Main Content

I’m a beginner at app dev and I’m trying out flutter. I’m currently having a problem with positioning my background on the project that I am currently testing out.I’m following a UI kit that I am trying to copy for the purpose of practicing, but I am having problem with the UI.

I tried using stack but the whole screen is wrapped with its children and not taking up space. it looks like this:

what i tried

and this is what I wanted to do:

what i want to do

This is the background that I wanted to put in my app, it is not literally a background or wallpaper because of its size. I just needed this to be placed at the bottom of the screen or background:
background image

this is the code that I currently have:

import 'package:audit_finance_app/constant/theme.dart';
import 'package:audit_finance_app/widgets/widgets.dart';
import 'package:audit_finance_app/screens/homescreen.dart';
import 'package:flutter/material.dart';
import 'dart:math' as math;

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

  @override
  State<SignInPage> createState() => _SignInPageState();
}

class _SignInPageState extends State<SignInPage> {
  late List<String> inputPass;
  String defaultPass = '1234';

  @override
  void initState() {
    inputPass = [];
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        fit: StackFit.expand,
        children: <Widget>[
          const SizedBox(
            width: double.maxFinite,
            height: double.maxFinite,
            child: Image(
              image: AssetImage('assets/background.png'),
            ),
          ),
          CustomScrollView(
            slivers: <Widget>[
              SliverAppBar(
                pinned: true,
                flexibleSpace: Container(
                  decoration: const BoxDecoration(
                    gradient: LinearGradient(
                      colors: [
                        AuditTheme.primaryColor,
                        AuditTheme.secondaryColor,
                      ],
                    ),
                  ),
                ),
                leadingWidth: 100,
                leading: Padding(
                  padding: const EdgeInsets.fromLTRB(10, 0, 0, 0),
                  child: Row(
                    children: const [
                      Expanded(
                        child: ImageIcon(
                          AssetImage('assets/logo/white_logo.png'),
                        ),
                      ),
                      Text(
                        'Audit',
                        style: TextStyle(fontSize: 20),
                      ),
                    ],
                  ),
                ),
                title: const Text('Sign In'),
                centerTitle: true,
                actions: [
                  Transform(
                    alignment: Alignment.center,
                    transform: Matrix4.rotationY(math.pi),
                    child: IconButton(
                      onPressed: () {},
                      icon: const Icon(Icons.sort),
                    ),
                  ),
                ],
              ),
              SliverList(
                delegate: SliverChildListDelegate(
                  [
                    Column(
                      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                      crossAxisAlignment: CrossAxisAlignment.center,
                      children: [
                        Widgets().sixedBoxHeight(50),
                        Column(
                          children: [
                            const CircleAvatar(
                              radius: 35,
                              backgroundImage:
                                  AssetImage('assets/logo/audit_logo.png'),
                            ),
                            Widgets().sixedBoxHeight(10),
                            const Text(
                              'Ledjoric Vermont',
                              style: TextStyle(fontSize: 20),
                            ),
                          ],
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            pinIconTest(inputPass.isNotEmpty
                                ? Colors.black
                                : Colors.grey),
                            pinIconTest(inputPass.length >= 2
                                ? Colors.black
                                : Colors.grey),
                            pinIconTest(inputPass.length >= 3
                                ? Colors.black
                                : Colors.grey),
                            pinIconTest(inputPass.length == 4
                                ? Colors.black
                                : Colors.grey),
                          ],
                        ),
                        Card(
                          child: Column(
                            children: [
                              Row(
                                mainAxisSize: MainAxisSize.min,
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: [
                                  numPad(const Text('1'), () => inputPin('1')),
                                  numPad(const Text('2'), () => inputPin('2')),
                                  numPad(const Text('3'), () => inputPin('3')),
                                ],
                              ),
                              Row(
                                mainAxisSize: MainAxisSize.min,
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: [
                                  numPad(const Text('4'), () => inputPin('4')),
                                  numPad(const Text('5'), () => inputPin('5')),
                                  numPad(const Text('6'), () => inputPin('6')),
                                ],
                              ),
                              Row(
                                mainAxisSize: MainAxisSize.min,
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: [
                                  numPad(const Text('7'), () => inputPin('7')),
                                  numPad(const Text('8'), () => inputPin('8')),
                                  numPad(const Text('9'), () => inputPin('9')),
                                ],
                              ),
                              Row(
                                mainAxisSize: MainAxisSize.min,
                                mainAxisAlignment: MainAxisAlignment.end,
                                children: [
                                  const SizedBox(
                                    width: 100,
                                    height: 100,
                                  ),
                                  numPad(const Text('0'), () => inputPin('0')),
                                  numPad(
                                    const Icon(Icons.backspace_sharp),
                                    () => deletePin(),
                                  ),
                                ],
                              ),
                            ],
                          ),
                        ),
                      ],
                    ),
                  ],
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }

  Widget pinIconTest(Color color) {
    return Padding(
      padding: const EdgeInsets.all(5.0),
      child: Icon(
        Icons.circle,
        size: 35,
        color: color,
      ),
    );
  }

  Widget numPad(Widget widget, void Function() function) {
    return SizedBox(
      width: 100,
      height: 100,
      child: TextButton(
        style: TextButton.styleFrom(
          foregroundColor: Colors.grey,
          textStyle: const TextStyle(
            fontSize: 30,
          ),
        ),
        onPressed: function,
        child: widget,
      ),
    );
  }

  void inputPin(String value) {
    setState(() {
      inputPass.length != 4 ? inputPass.add(value) : null;
      inputPass.length == 4 ? checkPass() : null;
    });
    print(inputPass);
  }

  void checkPass() {
    var stringList = inputPass.join('');
    if (stringList == defaultPass) {
      Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => const HomeScreen(),
        ),
      );
    }
    print(stringList);
  }

  void deletePin() {
    setState(() {
      inputPass.isNotEmpty ? inputPass.removeLast() : null;
    });
    print(inputPass);
  }
}

3

Answers


  1. You can use the example below for the status bar. I don’t know about the real problem.
    You can try using this way for gradient color

    SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      statusBarIconBrightness: Brightness.light,
      statusBarBrightness: Brightness.dark,
      statusBarGradient: LinearGradient(
        colors: [Colors.red, Colors.blue],
        begin: Alignment.topLeft,
        end: Alignment.bottomRight,
      ),
    );
    
    Login or Signup to reply.
  2. You need to wrap your image in a Positioned Widget.

    Positioned(bottom: 0.0,
               child: const SizedBox(
            width: double.maxFinite,
            height: double.maxFinite,
            child: Image(
                  image: AssetImage('assets/background.png'),
         ),
     ),
    

    Or you can use the alignment property of the Stack to stick everything onto the bottom. I’m not sure this is exactly what you want though.

    body: Stack(
        alignment: Alignment.bottomCenter,
        fit: StackFit.expand,
        children: <Widget>[
          const SizedBox(
            width: double.maxFinite,
            height: double.maxFinite,
            child: Image(
              image: AssetImage('assets/background.png'),
            ),
          ),
    
    Login or Signup to reply.
  3. I was missing the fact you want to place at the bottom that background, however to achieve that you can do it as the code below shows:

    class SignInPage extends StatefulWidget {
      const SignInPage({super.key});
    
      @override
      State<SignInPage> createState() => _SignInPageState();
    }
    
    class _SignInPageState extends State<SignInPage> {
      @override
      void initState() {
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Stack(
            fit: StackFit.expand,
            children: <Widget>[
              const Align(
                alignment: Alignment.bottomCenter,
                child: Image(
                  image: AssetImage('assets/background.png'),
                ),
              ),
              //Other child here
            ],
          ),
        );
      }
    }
    

    And this is the result:
    enter image description here

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search