如何为键盘外观上的Flutter布局设置动画

Geo*_*rge 10 ios dart flutter

我正在开发一个Flutter应用程序,主要用于iOS。

我的一个视图有一个文本字段,当您点击它时会出现iOS键盘。问题是-布局无法像在本地iOS应用中一样平滑地更改。而是,即使在键盘打开动画完成之前,它也会立即跳到最终可用的屏幕高度。

我尝试将SafeArea元素包装在中AnimatedSizeAnimatedContainer但没有帮助。

我的布局代码:

SafeArea(child:
  Column(children:[
    TextField(...)
  ])
)
Run Code Online (Sandbox Code Playgroud)

键盘出现时如何使布局平滑调整大小?

预期:

我的期望如何。gif

实际

效果-Flutter app.gif中的调整大小

YoB*_*oBo 6

我用类似的东西:

AnimatedPadding(
        padding: MediaQuery.of(context).viewInsets,
        duration: const Duration(milliseconds: 100),
        curve: Curves.decelerate,
        child: ....
    )
Run Code Online (Sandbox Code Playgroud)

这会根据 viewInsets(软件键盘高度)对填充进行动画处理。


Kap*_*ahu 6

使用 AnimatedPadding Widget 可以实现所需的输出,虽然这并不完美,但总比没有好:d

截至21年3月15日未决问题,供参考

import 'dart:math';

import 'package:flutter/material.dart';

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SafeArea(
      bottom: false,
      child: Scaffold(
          // !!! Important part > to disable default scaffold insets
          resizeToAvoidBottomInset: false,
          appBar: AppBar(
            title: Text("Appbar Title"),
          ),
          body: Stack(
            children: [
              Scrollbar(
                child: ListView.builder(
                  padding: EdgeInsets.all(0.0),
                  itemCount: 30,
                  itemBuilder: (context, i) {
                    return Container(
                      height: 100,
                      width: double.infinity,
                      color: Colors
                          .primaries[Random().nextInt(Colors.primaries.length)],
                    );
                  },
                ),
              ),
              Align(
                alignment: Alignment.bottomLeft,
                child: AnimatedPadding(
                    padding: MediaQuery.of(context).viewInsets,
                    // You can change the duration and curve as per your requirement:
                    duration: const Duration(milliseconds: 200),
                    curve: Curves.decelerate,
                    child: InputField()),
              )
            ],
          )),
    );
  }
}

class InputField extends StatefulWidget {
  InputField({Key key}) : super(key: key);

  @override
  _InputFieldState createState() => _InputFieldState();
}

class _InputFieldState extends State<InputField> {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.grey[100],
      padding: const EdgeInsets.symmetric(vertical: 6),
      child: Row(
        children: [
          SizedBox(
            width: 60,
            child: Icon(Icons.add_a_photo),
          ),
          Flexible(
            child: TextField(
              style: Theme.of(context).textTheme.bodyText1,
              decoration: InputDecoration(
                border: InputBorder.none,
                hintText: 'Enter text...',
              ),
            ),
          ),
          SizedBox(
            width: 60,
            child: Icon(Icons.send),
          ),
        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

输出-> 在此输入图像描述


xpe*_*dev -9

你应该尝试resizeToAvoidBottomPadding: false像这样设置:

return Scaffold(
      key: _scaffoldKey,
      resizeToAvoidBottomPadding: false,
Run Code Online (Sandbox Code Playgroud)