Флаттер: Позиционирование изображений в флаттере

#flutter #dart #flutter-layout

#трепетать #дротик #флаттер-макет

Вопрос:

Я только начал изучать некоторые учебные пособия, но у меня есть одна вещь, которую я хочу заархивировать. У меня проблема с размещением изображений в моем коде. В этом-то и проблема.

Изображение под логотипом.

Если кто-то может перекодировать это, потому что я пытаюсь 2 дня и не могу понять, как это работает.

Решение, которое я пытаюсь найти, состоит в том, чтобы расположить изображение под логотипом в правом верхнем углу без перемещения логотипа и текстбаров

Черновик моего желания:

Что я хочу сделать

My codes:

main.dart

 import 'package:flutter/material.dart'; import 'package:kafe/screens/login_screen.dart';       void main() {  runApp(const MyApp()); }   class MyApp extends StatelessWidget {  const MyApp({Key? key}) : super(key: key);    // This widget is the root of your application.  @override  Widget build(BuildContext context) {  return MaterialApp(  title: 'Email and Password Login',  theme: ThemeData(  primarySwatch: Colors.brown,  ),  home: LoginScreen(),  );  } }   

login_screen.dart

 import 'package:flutter/material.dart';   class LoginScreen extends StatefulWidget {  const LoginScreen({ Key? key }) : super(key: key);    @override  _LoginScreenState createState() =gt; _LoginScreenState(); }   class _LoginScreenState extends Statelt;LoginScreengt; {  // form key  final _formKey = GlobalKeylt;FormStategt;();    // Editing Controller final TextEditingController emailController = new TextEditingController(); final TextEditingController passwordController = new TextEditingController(); final TextEditingController locationController = new TextEditingController();    @override  Widget build(BuildContext context) {    //Name field  final emailField = TextFormField(  autofocus: false,  controller: emailController,  keyboardType: TextInputType.emailAddress,  //validator: {} {},  onSaved: (value)  {  emailController.text = value!;    },  textInputAction: TextInputAction.next,  decoration: InputDecoration(  prefixIcon: Icon(Icons.account_circle_outlined),  contentPadding: EdgeInsets.fromLTRB(20, 15, 20, 15),  hintText: "Вашето име",  border: OutlineInputBorder(  borderRadius: BorderRadius.circular(20),  ),  ),  );    //password field  final passwordField = TextFormField(  autofocus: false,  controller: passwordController,  //validator: {} {},  onSaved: (value)  {  passwordController.text = value!;    },  textInputAction: TextInputAction.next,  decoration: InputDecoration(  prefixIcon: Icon(Icons.call_end_outlined),  contentPadding: EdgeInsets.fromLTRB(20, 15, 20, 15),  hintText: "Вашиот телефонски број",  border: OutlineInputBorder(  borderRadius: BorderRadius.circular(20),  ),  ),  );    //Location field  final locationField = TextFormField(  autofocus: false,  controller: locationController,    //validator: {} {},  onSaved: (value)  {  locationController.text = value!;    },  textInputAction: TextInputAction.done,  decoration: InputDecoration(  prefixIcon: Icon(Icons.add_location_alt_outlined),  contentPadding: EdgeInsets.fromLTRB(20, 15, 20, 15),  hintText: "Вашата локација",  border: OutlineInputBorder(  borderRadius: BorderRadius.circular(20),    ),  )),    // button    loginButton = Material(  elevation: 5,  borderRadius: BorderRadius.circular(30),  color: Colors.redAccent,  child: MaterialButton(  padding: EdgeInsets.fromLTRB(20, 15, 20, 15),  minWidth: MediaQuery.of(context).size.width,  onPressed: () {},  child: Text(  "Логирање",   textAlign: TextAlign.center,   style: TextStyle(fontSize: 20,  color: Colors.white,  fontWeight: FontWeight.bold,  ),  ),  ),  );     return Scaffold(  backgroundColor: Colors.white,  body: Center(  child: SingleChildScrollView(  child: Container(  color: Colors.white,  child: Padding(  padding: const EdgeInsets.all(35.0),  child: Form(  key: _formKey,  child: Column(  mainAxisAlignment: MainAxisAlignment.center,  crossAxisAlignment: CrossAxisAlignment.center,  children: lt;Widgetgt; [    SizedBox(  width: 130,    child: SizedBox(  child: Image.asset("assets/top.png",  fit: BoxFit.contain,  ),  ),  ),        SizedBox(  height: 250,    child: Image.asset(  "assets/logo.png",    fit: BoxFit.contain,  )  ),            emailField,  SizedBox(height: 30),    passwordField,  SizedBox(height: 30),    locationField,  SizedBox(height: 30),  loginButton,  SizedBox(height: 30),  ],  ),    ),  ),  ),  ) ,  ),  );  } }    

Ответ №1:

В вашем дереве виджетов logo.png изображение помещается после top.png изображения, это проблема заказа, разместите logo как 1-го ребенка на Column

 crossAxisAlignment: CrossAxisAlignment.center,  children: lt;Widgetgt;[  SizedBox(  height: 250,  child: Image.asset(  "assets/logo.png",  fit: BoxFit.contain,  ),  ),  SizedBox(  width: 130,  child: Image.asset(  "assets/top.png",  fit: BoxFit.contain,  ),  ),  

Но следующее изображение опишите, как вы хотите расположить изображение. Для этого оберните SizedBox с Align помощью виджета.

 Align(  alignment: Alignment.topLeft,  child: SizedBox(  width: 130,  

Кроме того, я бы предпочел Stack в этом случае.

Ответ №2:

вы можете попробовать расположить или выровнять и пойти поиграть с ним. но вам нужно, чтобы они были упакованы стопкой

 Stack(  color: Colors.white,  child: Form(  key: _formKey,  child: Column(  mainAxisAlignment: MainAxisAlignment.center,  crossAxisAlignment: CrossAxisAlignment.center,  children: lt;Widgetgt; [    Positioned(  left:0,top:0  child: SizedBox(  width: 130,    child: SizedBox(  child: Image.asset("assets/top.png",  fit: BoxFit.contain,  ),  ),  ),  ),  Align(  alignment: Alingment.center,  child: Column(  children: [  SizedBox(  height: 250,    child: Image.asset(  "assets/logo.png",    fit: BoxFit.contain,  )  ),            emailField,  SizedBox(height: 30),    passwordField,  SizedBox(height: 30),    locationField,  SizedBox(height: 30),  loginButton,  SizedBox(height: 30),  ]  )  ),          ],  ),    ),  ),  ),