Scroll text fields into view when keyboard comes up and obscures them

I have several TextFormFields in a ListView, and it seems that if I tap into fields near the bottom (fields that would be obscured by the keyboard), the keyboard will appear and then immediately hide. I’m guessing it’s because it’s scrolling the list view which then causes the keyboard to dismiss. I've modified the flutter gallery text field demo and attached a video. Happens on both iOS and Android.
text_field_movie.zip

@Hixie @abarth this sounds familiar, do we already have this tracked/understood somewhere else?

This is basically the same bug as #105, #170, #172, #188.

@Hixie is there anything Posse can do to work around this bug?  This specific instantiation is currently considered as a high priority issue.

Not really. Mark it a blocker and I'll fix it in the next week or two. (I'm working on deep linking bugs right now, which I understand are also a high priority.)

There's a workaround that should get around this:
new ListView(
  reverse: true,
  children: <Widget>[
    // put your text fields here
  ].reversed.toList(),
),

This is inspired by how the Flutter UI codelab works (we want to use the bottom of the ListView as the scroll anchor instead of the top, so that the software keyboard will shift the list contents upwards).

You can use a SingleChildScrollView with a Column instead of a ListView to prevent the keyboard from dismissing. It won't solve the problem of the text field being hidden by the keyboard, but it would at least allow the user to scroll down to it and fill it out.

Thanks @collinjackson . The SingleChildScrollView workaround makes my form useable. The fix would be great so that the text fields aren't hidden requiring the user to scroll the field into view.

OK, good.
@Hixie is going to work on preventing fields from being scrolled offscreen by the keyboard as part of his work on #105 next week. Once that is done, we can close this bug and you'll be able to go back to using ListView.

I've begun work on this issue.

[x] Teach RenderSliverMultiBoxAdaptor to keep children alive
[ ] Test that RenderSliverMultiBoxAdaptor knows how to keep children alive
[ ] Test that RenderSliverMultiBoxAdaptor knows how to drop kept-alive children when they go away
[ ] Teach RenderSliverMultiBoxAdaptor to describe its children now that it has two sets of children
[ ] KeepAlive widget
[ ] KeepAliveAutomatically widget
[ ] Dispatch events to KeepAliveAutomatically when focused, when splashing, when dismissing
[ ] Actually move the focused item into view when the list is occluded.

I've a patch that does almost all of this. The two remaining bits are actually scrolling the text field into view, and handling text fields that have decorations because the reparenting is causing some sort of bug in my code and prematurely ejecting the row.

Ok, figured out the bug. Now I just need to do the scrolling into view part!

Here is an example for scrolling focused widgets into view. Should only be useful while this issue is still being worked on.

Workaround is in place so I removed the customer blocker label, but they would still like this fixed so we can remove the workaround.

I am too facing this problem with the keyboard. It was working fine previously but right now this problem is happing with the same piece of code.

@Rishab-1065 if you're using the workaround I posted above, try increasing the delay on like 57 from 300ms to a larger value.

I have this problem but it's a TextField in an Expanded in a Column with a Row and Divider in an Expanded in a Column.

it looks like

Hi, FYI this bug occurs for me when Form widget is added to the hierarchy.
So in my case ListView -> TextField or SingleChildScrollView -> Column -> TextField is fine, but Form -> ListView -> TextField or SingleChildScrollView -> Form -> Column -> TextField suffer from disappearing keyboard.

@collinjackson I am trying to use your workaround but I have multiple TextFieldForms not just one, and if I give them the same FocusNode they all get focused at the same time. Tyring to generate a FocusNode for each of them in the parent screen widget State doesn't seem to work either; in that case the original problem is back, i.e. widget hidden by the keyboard. Any suggestions what I could do?

@collinjackson any way to have that workaround not align the entire form to the bottom of the screen?

@dafesimonek are you sure the following works? coz it doesn't in my case :(

ListView -> TextField or SingleChildScrollView -> Column -> TextField

This is really a blocker. This issue really affects whole experience of an App. Can you pleas fix it asap. I can't move my App to prod with it.

This also blocks project:mulligan.

Blocking PEFLog too. I have tried those workarounds but they resolve the problem.
[https://photos.app.goo.gl/gRzFOv1dTgD9ZhrG3]

@pakivika this is likely not the bug that we're talking about here.
Yours looks like this one: https://github.com/flutter/flutter/issues/12084
Tips for resolving it: https://stackoverflow.com/a/48308741/1068346
Removing the scaffold from your tab page should fix the problem.

@jonasbark you're absolutely right. Thanks for your insight. I didn't realise it earlier when I changed my top level widget from CupertinoTabScaffold to Scaffold and then ended up having two Scaffolds.

Really needed for my app.

This isn't going to happen in the next month, but we will consider it a high priority after that. (We have work scheduled for the next few weeks already and this is not a trivial bug.)

Surely this already works by putting Scrollable.ensureVisible(contextOfTextField); in your FocusNode listener.

I get this issue when the TextFields are inside a Column. Is there a workaround for this case, or does it occur within everything? (I.e. Columns, ListViews, etc.)

Please get back on this. I was preparing a new blog post on how to make Data bindings in Flutter for Xamarin Forms devs but the hassle you have to get through just to keep your TextField visible will make them laugh so I will wait with that post I guess.

Me and @escamoteur have been working on a widget to sort this out.
https://gist.github.com/slightfoot/5db1582dcc49b1d6602fc7682fc9e987

But that is also only a work around.
What I also realized is that the FormsField demo of the Gallery Demo App doesn't scroll up. Which is kind of embarrassing

From flutter gallery.

Could you put  it. on high priority task list? To build a useful app, we cannot work on view only widgets.

This continues to be a high priority for us. I apologise for the delay on this. We completely agree that this behaviour is terrible.

Cool. any eta maybe?

@Hixie this surfaced as a top priority for Mulligan - do you know who's slated to work on it?

@goderbauer has been working on a fix.

@goderbauer any update on this?

It's coming along well. I am fixing up some bugs in the underlying "scroll something into view" logic right now which is a blocker for this one. Once that is resolved, fixing this bug is next.

excellent. Thank you for all the hard work.

Also waiting for this, thanks for the work

Will it still be necessary to wrap the part of the Page with TextField in a SingleChildScrollView ? Because the technique described here https://docs.flutter.io/flutter/widgets/SingleChildScrollView-class.html in case you have a Column with Expanded is a bit cumbersome.

It has been a year still people are waiting to get this fixed. I'm started rewriting my native android app in Flutter. But stuck at the login page itself because of this issue. This is the highest priority issue for developers since the form filling is a basic necessity for any app.

@rahulraj64 hang tight - a fix is in the works 😄

@rahulraj64 - the workaround mentioned by @collinjackson works perfectly for me. Just make sure your container view is scrollable.

@tvolkert could you comment on my comment above?

@escamoteur Can you elaborate what you mean? A textfield can only scroll into view if something surrounding the text field is scrollable.
What's your use case where you want to scroll a textfield into view without having something that scrolls? Can you post a code example?

As a relative novice to app development, I had been surprised to learn that adding scrollables was required. I had expected stuff would “just work” when the keyboard was triggered. I don’t really want my stuff to be scrollable, I just want the keyboard not to obscure my text.
There would be a certain simplicity if Flutter took care of that for me and I just focussed on making a layout that made sense without thinking about keyboards.
But great this is fixed.

@goderbauer I 100% agree with @dmjones. Especially as Flutter draws everything itself this should be possible.

If you want to position something within a column at the bottom of the screen and beeing able to scroll to the active field requires a LayoutBuilder a SingleChildScrollView a ConstrainedBox and an IntrinsicHeight in a not really intuitive setup. for a quite standard requirement this  is crazy.

+1 on this one. On adobe air, the screen just moves up when keyboard is activated, if it covers the keyboard.

If you don't want to use a Scrollable, you can design your App to make sure the content stays clear of any keyboard obstructions by using MediaQuery's viewInsets. For example:
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHome(),
    );
  }
}

class MyHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return new Material(
      child: new Padding(
        padding: new EdgeInsets.only(
          bottom: mediaQuery.viewInsets.bottom, // stay clear of the keyboard
        ),
        child: new Container(
          alignment: Alignment.bottomCenter,
          child: new TextField(),
        ),
      ),
    );
  }
}

In this example, the container resizes itself based on the available space and everything inside it gets re-layouted. That way, the TextField stays visible.
The Scaffold widget has this behavior build in unless you turn it off by setting resizeToAvoidBottomPadding to false.

@goderbauer  is this a workround, or the final solution?

@goderbauer sorry but are you serious? This only works if you have enough space for your content to fit on the screen together with your keyboard. You didn't comment on my critique on the current solution if you need a column with an expanded.

@goderbauer I really feel this issue should be reopened if what we have for now is a workaround and if the cases highlighted by @escamoteur are still very much valid.

It works perfectly in the latest master version when the form is wrapped in a ScrollView.

If you have 600 pixels of content to render, but the screen is only 400 pixels high, and you don't want it to be scrollable... I don't really know what you want Flutter to do?
Flutter's framework is designed not to have magic; if you don't say that something should be scrollable, then the framework isn't going to create all the machinery to have scrolling.

Are we just missing an abstraction here? I'm imagining something like:
final content = Column(
    children: <Widget>[
        Text("Foo"),
        Text("Bar"),
        Expanded(
            child: Text("Baz"),
        ),
    ],
);

// a Screen is always sized to the screen's native size.
// If, for example, a keyboard pops over it, it shows only a portion of the screen, but that portion is based on focus
final page = new Screen(
    child: content,
);

Let me ask this, @Hixie: how else would one achieve this? i.e. how does one make sure that Baz takes up whatever is left of the screen size after Foo and Bar are accounted for?

@Hixie we are not taking about pages that have more content than the screen is high.
Also I have no problem with putting something into a Schrollable but what about introducing a ScreenSizeConstraintBox or something to wrap a Column in this case to avoid the problem referenced above. That workaround is way to complicated and continuouslyis a problem especially for beginners

if I have 600 pixels of non-scrolling content, I would hope the Flutter rendering engine would introduce the necessary scrolling elements magically

@dmjones This is very much contrary to the philosophy of Flutter. The problem with doing things magically like this is that it has numerous disadvantages: there's a performance cost, the code becomes more complicated, it introduces layering violations which make the code more difficult to extend, etc. In fact, fundamentally, the rendering engine itself doesn't know about scrolling at all. It's just a canvas API. The scrolling is implemented in Dart by the framework.
@kentcb @escamoteur Assuming you have a Scaffold in your application, it already does what you describe. Maybe it's not working right?

@Hixie I tried two versions
a)

SingleChildScrollView
-Scaffold
body:
-Column
-item
-Expanded
b)

-Scaffold
-body:
- SingleChildScrollView
-Column
-item
-Expanded
Both result in an exception like this
Launching lib\main.dart on Android SDK built for x86 in debug mode...
registerResGeneratingTask is deprecated, use registerGeneratedFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedFolders(FileCollection)
registerResGeneratingTask is deprecated, use registerGeneratedFolders(FileCollection)
Built build\app\outputs\apk\debug\app-debug.apk.
I/FlutterActivityDelegate( 3703): onResume setting current activity to this
D/EGL_emulation( 3703): eglMakeCurrent: 0x9d532dc0: ver 3 1 (tinfo 0x9f4a6d60)
E/eglCodecCommon( 3703): glUtilsParamSize: unknow param 0x000082da
E/eglCodecCommon( 3703): glUtilsParamSize: unknow param 0x000082da
I/Choreographer( 3703): Skipped 31 frames!  The application may be doing too much work on its main thread.
D/EGL_emulation( 3703): eglMakeCurrent: 0xacc86620: ver 3 1 (tinfo 0x82354de0)
D/        ( 3703): HostConnection::get() New Host Connection established 0x8236fdc0, tid 3742
D/EGL_emulation( 3703): eglMakeCurrent: 0x9d532dc0: ver 3 1 (tinfo 0x82354b70)
I/flutter ( 3703): ++++++++++++++++++++++++++++++++++++++++++++++++++++++FirebaseUser({providerId: firebase, uid: oEUZdJdG6rWEsU4cok6hHI9Wfi53, displayName: , email<EMAIL_ADDRESS>isAnonymous: false, isEmailVerified: false, providerData: [{providerId: firebase, uid: oEUZdJdG6rWEsU4cok6hHI9Wfi53, displayName: , email<EMAIL_ADDRESS>{providerId: password, uid<EMAIL_ADDRESS>displayName: , email<EMAIL_ADDRESS>W/common.FileUtils( 3703): Failed to set dir world executable: java.io.FileNotFoundException: /data/user_de/0/com.google.android.gms/files/gmscore_global_dirs.txt: open failed: EACCES (Permission denied)
W/common.FileUtils( 3703): Failed to set dir world executable: java.io.FileNotFoundException: /data/user_de/0/com.google.android.gms/files/gmscore_global_dirs.txt: open failed: EACCES (Permission denied)
W/common.FileUtils( 3703): Failed to set dir world executable: java.io.FileNotFoundException: /data/user_de/0/com.google.android.gms/files/gmscore_global_dirs.txt: open failed: EACCES (Permission denied)
W/common.FileUtils( 3703): Failed to set dir world executable: java.io.FileNotFoundException: /data/user_de/0/com.google.android.gms/files/gmscore_global_dirs.txt: open failed: EACCES (Permission denied)
W/linker  ( 3703): /system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk!/lib/x86/libconscrypt_gmscore_jni.so: unused DT entry: type 0xf arg 0x91
V/NativeCrypto( 3703): Registering com/google/android/gms/org/conscrypt/NativeCrypto's 279 native methods...
I/ProviderInstaller( 3703): Installed default security provider GmsCore_OpenSSL
W/art     ( 3703): Before Android 4.1, method double java.util.concurrent.ThreadLocalRandom.internalNextDouble(double, double) would have incorrectly overridden the package-private method in java.util.Random
W/art     ( 3703): Before Android 4.1, method int java.util.concurrent.ThreadLocalRandom.internalNextInt(int, int) would have incorrectly overridden the package-private method in java.util.Random
W/art     ( 3703): Before Android 4.1, method long java.util.concurrent.ThreadLocalRandom.internalNextLong(long, long) would have incorrectly overridden the package-private method in java.util.Random
E/art     ( 3703): The String#value field is not present on Android versions >= 6.0
I/flutter ( 3703): Success! Event ID: 1e9bb4b0651244e6ac407d4d36e61e60
I/flutter ( 3703): ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter ( 3703): The following assertion was thrown during performLayout():
I/flutter ( 3703): RenderCustomMultiChildLayoutBox object was given an infinite size during layout.
I/flutter ( 3703): This probably means that it is a render object that tries to be as big as possible, but it was put
I/flutter ( 3703): inside another render object that allows its children to pick their own size.
I/flutter ( 3703): The nearest ancestor providing an unbounded height constraint is:
I/flutter ( 3703):   _RenderSingleChildViewport#abaa7 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):   creator: _SingleChildViewport ← _ScrollableScope ← IgnorePointer-[GlobalKey#8bcc1] ← Semantics ←
I/flutter ( 3703):   Listener ← _GestureSemantics ←
I/flutter ( 3703):   RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#5bf60] ←
I/flutter ( 3703):   _ExcludableScrollSemantics-[GlobalKey#93805] ← RepaintBoundary ← CustomPaint ← RepaintBoundary ←
I/flutter ( 3703):   NotificationListener<ScrollNotification> ← ⋯
I/flutter ( 3703):   parentData: <none> (can use size)
I/flutter ( 3703):   constraints: BoxConstraints(w=411.4, h=659.4)
I/flutter ( 3703):   size: MISSING
I/flutter ( 3703): The constraints that applied to the RenderCustomMultiChildLayoutBox were:
I/flutter ( 3703):   BoxConstraints(w=411.4, 0.0<=h<=Infinity)
I/flutter ( 3703): The exact size it was given was:
I/flutter ( 3703):   Size(411.4, Infinity)
I/flutter ( 3703): See https://flutter.io/layout/ for more information.
I/flutter ( 3703):
I/flutter ( 3703): When the exception was thrown, this was the stack:
I/flutter ( 3703): #0      RenderBox.debugAssertDoesMeetConstraints.<anonymous closure> (package:flutter/src/rendering/box.dart:1713:9)
I/flutter ( 3703): #1      RenderBox.debugAssertDoesMeetConstraints (package:flutter/src/rendering/box.dart:1787:6)
I/flutter ( 3703): #2      RenderBox.size=.<anonymous closure> (package:flutter/src/rendering/box.dart:1507:17)
I/flutter ( 3703): #3      RenderBox.size= (package:flutter/src/rendering/box.dart:1507:65)
I/flutter ( 3703): #4      RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:354:5)
I/flutter ( 3703): #5      RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #6      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #7      RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #8      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #9      _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1143:11)
I/flutter ( 3703): #10     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #11     _RenderSingleChildViewport.performLayout (package:flutter/src/widgets/single_child_scroll_view.dart:479:13)
I/flutter ( 3703): #12     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #13     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #14     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #15     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #16     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #17     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #18     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #19     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #20     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #21     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #22     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #23     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #24     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #25     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #26     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #27     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #28     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #29     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:199:11)
I/flutter ( 3703): #30     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #31     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #32     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #33     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #34     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #35     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #36     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #37     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #38     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #39     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:109:13)
I/flutter ( 3703): #40     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #41     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:2829:14)
I/flutter ( 3703): #42     RenderObject.layout (package:flutter/src/rendering/object.dart:1576:7)
I/flutter ( 3703): #43     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:520:15)
I/flutter ( 3703): #44     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1451:7)
I/flutter ( 3703): #45     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:710:18)
I/flutter ( 3703): #46     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:270:19)
I/flutter ( 3703): #47     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:627:13)
I/flutter ( 3703): #48     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208:5)
I/flutter ( 3703): #49     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
I/flutter ( 3703): #50     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930:9)
I/flutter ( 3703): #51     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5)
I/flutter ( 3703): #55     _invoke (dart:ui/hooks.dart:122:10)
I/flutter ( 3703): #56     _drawFrame (dart:ui/hooks.dart:109:3)
I/flutter ( 3703): (elided 3 frames from package dart:async)
I/flutter ( 3703):
I/flutter ( 3703): The following RenderObject was being processed when the exception was fired:
I/flutter ( 3703):   RenderCustomMultiChildLayoutBox#17fd1 relayoutBoundary=up3 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):   creator: CustomMultiChildLayout ← AnimatedBuilder ← DefaultTextStyle ← AnimatedDefaultTextStyle ←
I/flutter ( 3703):   _InkFeatures-[GlobalKey#683db ink renderer] ← NotificationListener<LayoutChangedNotification> ←
I/flutter ( 3703):   PhysicalModel ← AnimatedPhysicalModel ← Material ← PrimaryScrollController ← _ScaffoldScope ←
I/flutter ( 3703):   Scaffold ← ⋯
I/flutter ( 3703):   parentData: <none> (can use size)
I/flutter ( 3703):   constraints: BoxConstraints(w=411.4, 0.0<=h<=Infinity)
I/flutter ( 3703):   size: Size(411.4, Infinity)
I/flutter ( 3703): This RenderObject had the following descendants (showing up to depth 5):
I/flutter ( 3703):   RenderPositionedBox#9b1f8 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):     RenderFlex#ac7b7 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):       RenderRepaintBoundary#6312f NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):         RenderCustomPaint#cc056 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):           RenderRepaintBoundary#cd87f NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):       RenderPadding#ff17b NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):         RenderCustomPaint#bd755 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):           _TabLabelBarRenderer#b983a NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):   RenderConstrainedBox#e2300 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):     RenderSemanticsAnnotations#0018d NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):       RenderPhysicalModel#4b3d0 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):         _RenderInkFeatures#2fad0 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):           RenderPositionedBox#19f17 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):   RenderStack#d6105 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):     RenderTransform#41497 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703):       RenderTransform#8a57a NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/flutter ( 3703): Another exception was thrown: _RenderInkFeatures object was given an infinite size during layout.
I/flutter ( 3703): Another exception was thrown: RenderPhysicalModel object was given an infinite size during layout.
I/flutter ( 3703): Caught error: Cannot hit test a render box that has never been laid out.
I/flutter ( 3703): The hitTest() method was called on this RenderBox:
I/flutter ( 3703):   RenderStack#d6105 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703): Unfortunately, this object's geometry is not known at this time, probably because it has never been laid out. This means it cannot be accurately hit-tested. If you are trying to perform a hit test during the layout phase itself, make sure you only hit test nodes that have completed layout (e.g. the node's children, after their layout() method has been called).
I/flutter ( 3703): #0      RenderBox.hitTest.<anonymous closure> (package:flutter/src/rendering/box.dart:1853:11)
I/flutter ( 3703): #1      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1876:6)
I/flutter ( 3703): #2      _RenderCustomMultiChildLayoutBox&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:2205:17)
I/flutter ( 3703): #3      RenderCustomMultiChildLayoutBox.hitTestChildren (package:flutter/src/rendering/custom_layout.dart:365:12)
I/flutter ( 3703): #4      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #5      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #6      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #7      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #8      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #9      RenderPhysicalModel.hit
I/flutter ( 3703): In dev mode. Not sending report to Sentry.io.
I/flutter ( 3703): Caught error: Cannot hit test a render box that has never been laid out.
I/flutter ( 3703): The hitTest() method was called on this RenderBox:
I/flutter ( 3703):   RenderStack#d6105 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703): Unfortunately, this object's geometry is not known at this time, probably because it has never been laid out. This means it cannot be accurately hit-tested. If you are trying to perform a hit test during the layout phase itself, make sure you only hit test nodes that have completed layout (e.g. the node's children, after their layout() method has been called).
I/flutter ( 3703): #0      RenderBox.hitTest.<anonymous closure> (package:flutter/src/rendering/box.dart:1853:11)
I/flutter ( 3703): #1      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1876:6)
I/flutter ( 3703): #2      _RenderCustomMultiChildLayoutBox&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:2205:17)
I/flutter ( 3703): #3      RenderCustomMultiChildLayoutBox.hitTestChildren (package:flutter/src/rendering/custom_layout.dart:365:12)
I/flutter ( 3703): #4      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #5      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #6      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #7      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #8      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #9      RenderPhysicalModel.hit
I/flutter ( 3703): In dev mode. Not sending report to Sentry.io.
I/flutter ( 3703): Caught error: Cannot hit test a render box that has never been laid out.
I/flutter ( 3703): The hitTest() method was called on this RenderBox:
I/flutter ( 3703):   RenderStack#d6105 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703): Unfortunately, this object's geometry is not known at this time, probably because it has never been laid out. This means it cannot be accurately hit-tested. If you are trying to perform a hit test during the layout phase itself, make sure you only hit test nodes that have completed layout (e.g. the node's children, after their layout() method has been called).
I/flutter ( 3703): #0      RenderBox.hitTest.<anonymous closure> (package:flutter/src/rendering/box.dart:1853:11)
I/flutter ( 3703): #1      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1876:6)
I/flutter ( 3703): #2      _RenderCustomMultiChildLayoutBox&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:2205:17)
I/flutter ( 3703): #3      RenderCustomMultiChildLayoutBox.hitTestChildren (package:flutter/src/rendering/custom_layout.dart:365:12)
I/flutter ( 3703): #4      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #5      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #6      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #7      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #8      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #9      RenderPhysicalModel.hit
I/flutter ( 3703): In dev mode. Not sending report to Sentry.io.
I/flutter ( 3703): Caught error: Cannot hit test a render box that has never been laid out.
I/flutter ( 3703): The hitTest() method was called on this RenderBox:
I/flutter ( 3703):   RenderStack#d6105 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703): Unfortunately, this object's geometry is not known at this time, probably because it has never been laid out. This means it cannot be accurately hit-tested. If you are trying to perform a hit test during the layout phase itself, make sure you only hit test nodes that have completed layout (e.g. the node's children, after their layout() method has been called).
I/flutter ( 3703): #0      RenderBox.hitTest.<anonymous closure> (package:flutter/src/rendering/box.dart:1853:11)
I/flutter ( 3703): #1      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1876:6)
I/flutter ( 3703): #2      _RenderCustomMultiChildLayoutBox&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:2205:17)
I/flutter ( 3703): #3      RenderCustomMultiChildLayoutBox.hitTestChildren (package:flutter/src/rendering/custom_layout.dart:365:12)
I/flutter ( 3703): #4      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #5      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #6      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #7      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #8      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #9      RenderPhysicalModel.hit
I/flutter ( 3703): In dev mode. Not sending report to Sentry.io.
I/flutter ( 3703): Caught error: Cannot hit test a render box that has never been laid out.
I/flutter ( 3703): The hitTest() method was called on this RenderBox:
I/flutter ( 3703):   RenderStack#d6105 NEEDS-LAYOUT NEEDS-PAINT
I/flutter ( 3703): Unfortunately, this object's geometry is not known at this time, probably because it has never been laid out. This means it cannot be accurately hit-tested. If you are trying to perform a hit test during the layout phase itself, make sure you only hit test nodes that have completed layout (e.g. the node's children, after their layout() method has been called).
I/flutter ( 3703): #0      RenderBox.hitTest.<anonymous closure> (package:flutter/src/rendering/box.dart:1853:11)
I/flutter ( 3703): #1      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1876:6)
I/flutter ( 3703): #2      _RenderCustomMultiChildLayoutBox&RenderBox&ContainerRenderObjectMixin&RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:2205:17)
I/flutter ( 3703): #3      RenderCustomMultiChildLayoutBox.hitTestChildren (package:flutter/src/rendering/custom_layout.dart:365:12)
I/flutter ( 3703): #4      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #5      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #6      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #7      _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:118:19)
I/flutter ( 3703): #8      RenderBox.hitTest (package:flutter/src/rendering/box.dart:1878:11)
I/flutter ( 3703): #9      RenderPhysicalModel.hit
I/flutter ( 3703): In dev mode. Not sending report to Sentry.io.

Besides this, why then the complicated solution on the SingleChildScrollView doc pages?

@Hixie  Master channel, doesn't work inside of a Modal Bottom Sheet. Any workaround this?
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: ''),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('')),
body: Container(),
floatingActionButton: FloatingActionButton(onPressed: () {
showModalBottomSheet(context: context, builder: (context){
return ListView.builder(
itemBuilder: (context, index) {
return TextField(decoration: InputDecoration(labelText: index.toString()),);
},
itemCount: 30,
);
});
}),
);
}
}

Please file separate bugs for each individual problem you run into. Let's keep this bug focused on the original issue of scrolling a scrollable when there's a text field that gets obscured by the keyboard.

@Hixie just done but the above is about this issue

@Hixie here are one example from flutter gallery. When I select the password field, keyboard shows up and make the password field behind it.
I wish flutter could take care it, like what chrome doing. Automatically scrolls text field up on keyboard when keyboard show up.

@mingoal  This is already fixed in master branch

@IhorKlimov could you too move your issue about bottom sheet into its own issue an delete the one here?

I'm running Flutter (Channel beta, v0.5.1, on Linux, locale en_US.UTF-8), and have the same issue, the keyboard hides my input field when it appears

I am also still having the same issue, have run flutter doctor and flutter get and flutter upgrade

@alexandrpunk @goodis0 please make sure you are using the (unstable) master channel to test this functionality. It did not arrive in dev / beta channel yet afaik. I tested it today and it works as expected - if a parent widget is a scrollview.

@jonasbark
So I am on the master channel and still having this issue with a form
`import 'package:flutter/material.dart';
import 'package:contacts_service/contacts_service.dart';
class _ContactData {
String firstName = '';
String lastName = '';
String email = '';
String phoneNumber = '';
}
createContact(data) {
Item phone =
new Item(label: "Phone Number", value: data.phoneNumber.toString());
Item email = new Item(label: "Email", value: data.email.toString());
Contact contact = new Contact(
givenName: data.firstName,
familyName: data.lastName,
phones: [phone],
emails: [email]);
ContactsService.addContact(contact).catchError((err) {
print(err);
});
}
class ContactDetails extends StatelessWidget {
ContactDetails(this._contact);
final Contact _contact;
_ContactData _data = new _ContactData();
final GlobalKey _formKey = new GlobalKey();
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(_contact.displayName ?? ""),
actions: [
new FlatButton(
child: _contact.givenName != null
? new Icon(Icons.delete)
: null,
onPressed: () {
ContactsService.deleteContact(_contact);
})
]),
body: new Scrollbar(
child: new ContactDetailsForm(formKey: _formKey, data: _data)
),
);
}
}
class ContactDetailsForm extends StatelessWidget {
const ContactDetailsForm({
Key key,
@required this.formKey,
@required this.data,
}) : super(key: key);
final GlobalKey formKey;
final _ContactData data;
@override
Widget build(BuildContext context) {
return new SingleChildScrollView(
child: new Form(
key: formKey,
autovalidate: false,
child: new Column(
children: [
new TextFormField(
keyboardType:
TextInputType.text, // Use email input type for emails.
decoration: new InputDecoration(
hintText: 'John', labelText: 'First Name'),
onSaved: (String value) {
this.data.firstName = value;
}),
new TextFormField(
keyboardType:
TextInputType.text, // Use email input type for emails.
decoration: new InputDecoration(
hintText: 'Doe', labelText: 'Last Name'),
onSaved: (String value) {
this.data.lastName = value;
}),
new TextFormField(
keyboardType: TextInputType
.emailAddress, // Use email input type for emails.
decoration: new InputDecoration(
hintText<EMAIL_ADDRESS>labelText: 'E-mail Address'),
onSaved: (String value) {
this.data.email = value;
}),
new TextFormField(
keyboardType:
TextInputType.phone, // Use email input type for emails.
decoration: new InputDecoration(
hintText: '111-222-3333', labelText: 'Phone Number'),
onSaved: (String value) {
this.data.phoneNumber = value;
}),
new Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: new RaisedButton(
onPressed: () {
formKey.currentState.save();
createContact(data);
},
child: new Text('Submit'),
),
),
],
),
),
);
}
}
`
Any idea or help is much appreciated

@khrice what's the output of flutter doctor --verbose?

@goderbauer
[✓] Flutter (Channel master, v0.5.6-pre.27, on Mac OS X 10.13.5 17F77, locale en-US)
• Flutter version 0.5.6-pre.27 at /Users/Keegan/bin/flutter
• Framework revision bb23a110e0 (5 hours ago), 2018-06-19 16:41:27 +0200
• Engine revision 0c119932c0
• Dart version 2.0.0-dev.62.0.flutter-4b2d60cb18
[✓] Android toolchain - develop for Android devices (Android SDK 27.0.3)
• Android SDK at /Users/Keegan/Library/Android/sdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-27, build-tools 27.0.3
• Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)
• All Android licenses accepted.
[✓] iOS toolchain - develop for iOS devices (Xcode 9.4.1)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Xcode 9.4.1, Build version 9F2000
• ios-deploy 1.9.2
• CocoaPods version 1.5.3
[✓] Android Studio (version 3.1)
• Android Studio at /Applications/Android Studio.app/Contents
✗ Flutter plugin not installed; this adds Flutter specific functionality.
✗ Dart plugin not installed; this adds Dart specific functionality.
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b01)
[!] VS Code (version 1.24.1)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension not installed; install from
https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter
[✓] Connected devices (1 available)
• Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.0.0 (API 26) (emulator)
! Doctor found issues in 1 category.

If I take your code and add the following to make it runnable:
void main() {
  runApp(new MaterialApp(home: new ContactDetails()));
}

it works just fine. If I tap on a textfield, the textfield scrolls up slightly to not be covered by the keyboard.

@goderbauer hmm your right that does work just fine, it must with how I am navigating to it? here is my main.dart
import 'dart:async';
import 'package:flutter/material.dart';
import './contactDetails.dart';
import 'package:contacts_service/contacts_service.dart';
import 'package:google_sign_in/google_sign_in.dart';

GoogleSignIn _googleSignIn = new GoogleSignIn(
  scopes: <String>[
    'email',
    'https://www.googleapis.com/auth/contacts.readonly',
  ],
);

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Contacts',
      theme: new ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or press Run > Flutter Hot Reload in IntelliJ). Notice that the
        // counter didn't reset back to zero; the application is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Contacts App'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  GoogleSignInAccount _currentUser;

  @override
  void initState() {
    super.initState();
    _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
      setState(() {
        _currentUser = account;
      });
      if (_currentUser != null) {

      }
    });
    _googleSignIn.signInSilently();
  }

  Future<Null> _handleSignIn() async {
    try {
      await _googleSignIn.signIn();
    } catch (error) {
      print(error);
    }
  }

  void _createContact() {
    Navigator.push(
      context,
      new MaterialPageRoute(builder: (context) => new CreateContact()),
    );
  }

  @override
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _createContact method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.
    return new Scaffold(
      body: new Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: <Widget>[
          const Text("You are not currently signed in."),
          new RaisedButton(
            child: const Text('SIGN IN'),
            onPressed: _handleSignIn,
          ),
        ],
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _createContact,
        tooltip: 'CreatContact',
        child: new Icon(Icons.add),
      ) // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class CreateContact extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new ContactDetails(new Contact());
  }
}

The issue is fixed in the Master channel for me

@Hixie https://github.com/flutter/flutter/issues/10826#issuecomment-397960703 what do you think about this?
also https://github.com/flutter/flutter/issues/18558

With the current implementation the keyboard scrolls right below the TextField.

I made a PR to expose the constant (which is currently set to 20.0) to the constructor. This would solve that problem.
I just talked to @slightfoot and he said it would also be great to allow setting the alignment (on the screen) besides the scrollPadding.
Also, wouldn't it be better to extract that logic into a separate widget and wrap the EditableText with said widget internally?
Reusability would benefit a lot from this. For example if there's another widget which would like to be scrolled into view when focused it could just wrap itself with that widget.
I think something like @slightfoot 's widget  would do a great job for that.
@Hixie @goderbauer what do you think?

As this feature is almost always required it should not be a separate Widget IMHO. I don't want to clutter all my Forms with additional widgets making the code less readable.

I meant the text widgets should use that widget internally by default. But because it's a separate widget it could also be reused somewhere else.

I would encourage everyone to file separate bugs for each change that they would like made and each issue that they still see. Commenting on this specific issue is unlikely to lead to changes since it was filed on a specific issue which is now resolved.

I had the same issue and I found this working solution : https://www.didierboelens.com/2018/04/hint-4-ensure-a-textfield-or-textformfield-is-visible-in-the-viewport-when-has-the-focus/

I am also experiencing this issue
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel beta, v0.5.1, on Microsoft Windows [Version 10.0.17134.48], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK 27.0.3)
[√] Android Studio (version 3.1)
[√] IntelliJ IDEA Ultimate Edition (version 2017.3)
[!] VS Code, 64-bit edition (version 1.24.1)
[√] Connected devices (1 available)

Checked out the master branch. Issue still persists. Dynamic form fields when tapped keyboard comes up and dismissed automatically and widgets on the page are built again.
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel master, v0.5.6-pre.84, on Microsoft Windows [Version 10.0.17134.48], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK 27.0.3)
[√] Android Studio (version 3.1)
[√] IntelliJ IDEA Ultimate Edition (version 2017.3)
[!] VS Code, 64-bit edition (version 1.24.1)
[√] Connected devices (1 available)

have the issue.

It's fixed on the Flutter master branch

@diegoveloper Thanks for the information... i switched to the master channel, but the SingleChildScrollView() doesn't work for me...
##First Issue
When the SingleChildScrollView() is the second child element in my build() Method, it looks like this:

The Code of that is:
import 'package:flutter/material.dart';

class AuthPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _AuthPageState();
  }
}

class _AuthPageState extends State<AuthPage> {
  final Map<String, dynamic> _formData = {
    'email': null,
    'password': null,
  };
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  DecorationImage buildBackgroundImage() {
    return DecorationImage(
      fit: BoxFit.cover,
      image: AssetImage('assets/login_background.jpg'),
    );
  }

  Widget buildUsernameTextField() {
    return TextFormField(
      keyboardType: TextInputType.emailAddress,
      decoration: InputDecoration(labelText: 'Username'),
      validator: (String value) {
        if (value.isEmpty ||
            !RegExp(r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
                .hasMatch(value)) {
          return 'Please enter a valid Email-Address';
        }
      },
      onSaved: (String value) {
        _formData['email'] = value;
      },
    );
  }

  Widget buildPasswordTextField() {
    return TextFormField(
      obscureText: true,
      decoration: InputDecoration(labelText: 'Password'),
      validator: (String value) {
        if (value.isEmpty || value.length > 8) {
          return 'Password is required and should be 8+ characters';
        }
      },
      onSaved: (String value) {
        _formData['password'] = value;
      },
    );
  }

  Widget buildActionButtons() {
    return Container(
      margin: EdgeInsets.only(top: 500.0, left: 20.0, right: 20.0),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.end,
        children: <Widget>[
          Expanded(
            child: FloatingActionButton(
              backgroundColor: Colors.white,
              child: ConstrainedBox(
                constraints: BoxConstraints.expand(),
                child: Image.asset('assets/google_icon.png'),
              ),
              mini: false,
              shape: CircleBorder(side: BorderSide.none),
              onPressed: () {},
            ),
          ),
          Expanded(
            child: FloatingActionButton(
              backgroundColor: Color.fromARGB(255, 76, 103, 141),
              foregroundColor: Colors.white,
              child: Icon(Icons.arrow_forward_ios),
              mini: false,
              shape: CircleBorder(side: BorderSide.none),
              onPressed: () {},
            ),
          ),
        ],
      ),
    );
  }

  _submitLogin() {
    //Firebase Login Function
    Navigator.pushReplacementNamed(context, '/events');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          image: buildBackgroundImage(),
        ),
        child: SingleChildScrollView(
          child: Column(
            children: <Widget>[
              Container(
                margin: EdgeInsets.only(top: 40.0, left: 20.0, right: 20.0),
                child: Row(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    Expanded(
                      child: Text(
                        'Sign In',
                        style: TextStyle(
                          color: Colors.white,
                          fontWeight: FontWeight.bold,
                          fontSize: 18.0,
                        ),
                      ),
                    ),
                    Container(
                      child: FloatingActionButton(
                        backgroundColor: Color.fromARGB(255, 21, 32, 51),
                        foregroundColor: Colors.white,
                        child: Icon(Icons.add),
                        mini: true,
                        shape: CircleBorder(side: BorderSide.none),
                        onPressed: () {},
                      ),
                    ),
                  ],
                ),
              ),
              Stack(
                children: <Widget>[
                  Container(
                    padding: EdgeInsets.all(15.0),
                    margin:
                        EdgeInsets.only(top: 310.0, left: 20.0, right: 20.0),
                    decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.circular(5.0)),
                    child: Form(
                      child: Column(
                        children: <Widget>[
                          buildUsernameTextField(),
                          SizedBox(
                            height: 10.0,
                          ),
                          buildPasswordTextField(),
                          SizedBox(
                            height: 50.0,
                          ),
                        ],
                      ),
                    ),
                  ),
                  buildActionButtons(),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

Second Issue

The Code of that is:
import 'package:flutter/material.dart';

class AuthPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _AuthPageState();
  }
}

class _AuthPageState extends State<AuthPage> {
  final Map<String, dynamic> _formData = {
    'email': null,
    'password': null,
  };
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  DecorationImage buildBackgroundImage() {
    return DecorationImage(
      fit: BoxFit.cover,
      image: AssetImage('assets/login_background.jpg'),
    );
  }

  Widget buildUsernameTextField() {
    return TextFormField(
      keyboardType: TextInputType.emailAddress,
      decoration: InputDecoration(labelText: 'Username'),
      validator: (String value) {
        if (value.isEmpty ||
            !RegExp(r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
                .hasMatch(value)) {
          return 'Please enter a valid Email-Address';
        }
      },
      onSaved: (String value) {
        _formData['email'] = value;
      },
    );
  }

  Widget buildPasswordTextField() {
    return TextFormField(
      obscureText: true,
      decoration: InputDecoration(labelText: 'Password'),
      validator: (String value) {
        if (value.isEmpty || value.length > 8) {
          return 'Password is required and should be 8+ characters';
        }
      },
      onSaved: (String value) {
        _formData['password'] = value;
      },
    );
  }

  Widget buildActionButtons() {
    return Container(
      margin: EdgeInsets.only(top: 500.0, left: 20.0, right: 20.0),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.end,
        children: <Widget>[
          Expanded(
            child: FloatingActionButton(
              backgroundColor: Colors.white,
              child: ConstrainedBox(
                constraints: BoxConstraints.expand(),
                child: Image.asset('assets/google_icon.png'),
              ),
              mini: false,
              shape: CircleBorder(side: BorderSide.none),
              onPressed: () {},
            ),
          ),
          Expanded(
            child: FloatingActionButton(
              backgroundColor: Color.fromARGB(255, 76, 103, 141),
              foregroundColor: Colors.white,
              child: Icon(Icons.arrow_forward_ios),
              mini: false,
              shape: CircleBorder(side: BorderSide.none),
              onPressed: () {},
            ),
          ),
        ],
      ),
    );
  }

  _submitLogin() {
    //Firebase Login Function
    Navigator.pushReplacementNamed(context, '/events');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          image: buildBackgroundImage(),
        ),
        child: Column(
          children: <Widget>[
            Container(
              margin: EdgeInsets.only(top: 40.0, left: 20.0, right: 20.0),
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                    child: Text(
                      'Sign In',
                      style: TextStyle(
                        color: Colors.white,
                        fontWeight: FontWeight.bold,
                        fontSize: 18.0,
                      ),
                    ),
                  ),
                  Container(
                    child: FloatingActionButton(
                      backgroundColor: Color.fromARGB(255, 21, 32, 51),
                      foregroundColor: Colors.white,
                      child: Icon(Icons.add),
                      mini: true,
                      shape: CircleBorder(side: BorderSide.none),
                      onPressed: () {},
                    ),
                  ),
                ],
              ),
            ),
            SingleChildScrollView(
              child: Stack(
                children: <Widget>[
                  Container(
                    padding: EdgeInsets.all(15.0),
                    margin:
                        EdgeInsets.only(top: 310.0, left: 20.0, right: 20.0),
                    decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.circular(5.0)),
                    child: Form(
                      child: Column(
                        children: <Widget>[
                          buildUsernameTextField(),
                          SizedBox(
                            height: 10.0,
                          ),
                          buildPasswordTextField(),
                          SizedBox(
                            height: 50.0,
                          ),
                        ],
                      ),
                    ),
                  ),
                  buildActionButtons(),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Where is my mistake? Is that also a bug or a problem from me?
Thanks for our answer and our help

@ITforHome From your post its unclear to me what your actual issue is. Also, StockOverflow may be a better place for these kind of questions.

If you have run into regressions, please please please file a bug with a reduced test case (a short main.dart that reproduces the problem) and explain which version it worked in and which version it broke in. Thanks!

@goderbauer My wish is that the white login field moves up when the keyboard is displayed. However, the upper text (sign in) and the button should remain visible. In the two cases I described, this was not possible...
So the question is whether this is a bug at all or if I misspelled the code... and if I misspelled the code, how would the code look right...? Have you got any ideas?

I read almost all the post. Stack > Form > SingleChildScrollView(reverse true) > Column - fix most of the keyboard-textfields problems (on ios). But when I scroll all the way down and the input is near the (top)AppBar it disappears up(goes under the AppBar).
Is someone found the solution for this. Did I missed something ?

@cosinus84 You may want to file a separate bug for that with some minimal example code that shows the problem. It's possible that the AppBar doesn't properly tell us that it is going to overlap content.

This bug is still around.
Keyboard hiding textfield that has the focus ? I have tried all the fixes in this thread and others nothing works.

@eddywm which branch/channel did you test this in? it's not in beta yet.

@acidjazz I'm on the beta branch.

@eddywm i think you have to wait until its in that branch, i believe this fix is only in the dev branch.
if you want, try flutter channel dev and then recompile/etc

It's fixed and text fields aren't obscured by the keyboard anymore, but I have another problem. Below text field I have button that I want to be visible when keyboard appears. Is there a way to add a offset to a point where it scrolls to make it scroll a little higher, or manually scroll so a button is above keyboard? Any other solution to this?

@dankop123 https://github.com/flutter/flutter/pull/18562/files should allow that with added scrollPadding currently only available in master

@zoechi Thanks!

@joaovirgili
Please consider asking support questions in one of the other channels listed at http://flutter.io/support .

Actually, there was a few issues with this after testing, but adding resizeToAvoidBottomPadding: true to the Scaffold fixed mine.

How can I put my form centered and when the keyboard is shown put all up of the keyboard?

You can use a SingleChildScrollView with a Column instead of a ListView to prevent the keyboard from dismissing. It won't solve the problem of the text field being hidden by the keyboard, but it would at least allow the user to scroll the field into view and then fill it out.

you solved my problem i had the issue like my error messages are gone, after scrolling to down and go upwards my errors are missing.
My Error widget tree:
Form -> Listview
Correct widget tree:
Form -> SingleChildScrollView -> Column

@eddywm i think you have to wait until its in that branch, i believe this fix is only in the dev branch.
if you want, try flutter channel dev and then recompile/etc

@acidjazz
not in master yet ?
cause I still have this issue on master

In my case I realized when I had windowFullscreen style attribute of the LaunchTheme set to true
<item name="android:windowFullscreen">true</item>,
 SystemChrome.* methods did not work. These methods started working as expected when I set it to false.

Any update?

Don't know if this is still an issue, but it was for me today with the stable ask branch. I noticed that the SingleChildScrollView was moving when the text field was being focused and almost outside of the viewport. So I thought that maybe the keyboard height was missing to the scrolling position. And indeed it was, I added the text field the property scrollPadding the bottom view inset size and it worked like charm (MediaQuery.of(context).viewInsets.bottom). Hope it helps.

@Blacktoviche something like this should do the trick:
class ColumnScrollView extends StatelessWidget {
  final List<Widget> children;
  final EdgeInsets padding;
  final CrossAxisAlignment crossAxisAlignment;
  final MainAxisAlignment mainAxisAlignment;
  final MainAxisSize mainAxisSize;

  const ColumnScrollView(
      {Key key,
      @required this.children,
      this.crossAxisAlignment = CrossAxisAlignment.center,
      this.mainAxisAlignment = MainAxisAlignment.start,
      this.mainAxisSize = MainAxisSize.max,
      this.padding = const EdgeInsets.symmetric(horizontal: 20.0)})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (BuildContext ctx, BoxConstraints viewportConstrains) {
        return SingleChildScrollView(
          child: ConstrainedBox(
              constraints: BoxConstraints(minHeight: viewportConstrains.maxHeight),
              child: IntrinsicHeight(
                child: Padding(
                  padding: padding,
                  child: Column(
                    children: children,
                    crossAxisAlignment: crossAxisAlignment,
                    mainAxisAlignment: mainAxisAlignment,
                  ),
                ),
              )),
        );
      },
    );
  }
}

class TestWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var keyboardHeight = MediaQuery.of(context).viewInsets.bottom;
    return Scaffold(
      body: ColumnScrollView(
        children: [
          SizedBox(
            height: 400,
          ),
          TextField(
              scrollPadding: EdgeInsets.symmetric(vertical: keyboardHeight + 20) // 20 is default widget scroll padding,
              ),
          SizedBox(
            height: 400,
          ),
        ],
      ),
    );
  }
}

Thankx @hazzo but unfortunately it didn't work.  But my code worked fine after little investigating about the problem cause.
please refer to this 64392#issuecomment-678997571  for more details

Wrap your widget inside Scaffold and set resizeToAvoidBottomInset: true,

Wrap your widget inside Scaffold and set resizeToAvoidBottomInset: true,

There's a workaround that should get around this:
new ListView(
  reverse: true,
  children: <Widget>[
    // put your text fields here
  ].reversed.toList(),
),

This is inspired by how the Flutter UI codelab works (we want to use the bottom of the ListView as the scroll anchor instead of the top, so that the software keyboard will shift the list contents upwards).
Unfortunately, it can introduce a new bug if the scrolling pushes the text fields upwards and they end up getting hidden by the top. If you only have a few text fields and they're at the bottom of your ListView, this might be just fine, but it would still be a problem if you have a lot of text fields.

Thank you for posting your reply @collinjackson. I had the same problem. However, I was using ListView.builder, so it wasn't just like you did, but this workaround worked for me:
ListView.builder(
        reverse: true, // <======  ADDED THIS
        itemCount: tasks.length,
        itemBuilder: (context, index) {
          index = (index - tasks.length).abs(); // <======  ADDED THIS
          // Keep same code as before
        },
        ...
);

This worked just fine, kept the list in same order. However need to do a +1 in the index reassignment to handle out of index.
index = (index + 1 - tasks.length).abs()


Changed contact-us option from dedicated page to mailto link.

why have you created a new PR?
Rather than creating new, make a new commit to your previous PR after taking latest pull from main.


[FEATURE] Inappropriate Footer Displayed Instead of PageNotFound for Incorrect URL

Description
When a user enters an incorrect URL type, instead of being redirected to a proper PageNotFound page, the website displays the footer. This creates a confusing user experience as users expect to see an informative PageNotFound page, providing guidance and relevant information about the error
Describe the solution you'd like
Implement a proper PageNotFound page to replace the inappropriate footer display when users enter an incorrect URL type. Provide clear error messaging and helpful navigation options to improve the user experience.
Screenshots
https://github.com/Frenziecodes/Projest/assets/103263909/7d2382c1-ce53-4b6a-a29c-c741caa6ccac
Additional information
No response

Fixed! Thanks for bringing this to our attention. We appreciate your help in identifying and resolving the issue.


Example works with VMWare Provider

The "ubuntu/trusty64" box does not have a version for VMWare so the
example did not work if VMWare was the provider. These changes should
allow the example to work under any provider.

Normally going back to old Ubuntu's would not be ideal, and ubuntu/trusty64 is the most commonly used Vagrant package by far because of VirtualBox's wide usage, but considering the version of Ubuntu makes no difference to this example and it makes the example work out of the box in more environments, then :+1:.
I've merged this manually at 29715697cee55b470c242d6ab7ea68e85cc7e895 this without apt-transport-https to keep the example as barebones as possible and avoid introducing concepts unrelated to demoing vagrant-docker-compose.


Chromebook and Android based Microsoft RDP Shift Key Sticking Issue

Using Android based Microsoft RDP app.. the Shift key "sticks on" sometimes...  So when typing, it will sometimes stick, like when trying to type in  FreeMasons... it will come in as FREEmasons with the "second shift key hit resetting it to lower case...  Very frustrating when trying to reset passwords ;)

Thanks for your dedication to our documentation. If we have been unable to review your issue in a timely manner, we sincerely apologize for the delayed response. We have captured the informtion you have provided for review. We are closing this issue for now, but if you feel that it's still a concern, please respond and let us know. If you determine another possible update to our documentation, please don't hesitate to reach out again. #please-close


update kustomize example for microservices

Update delivery/kustomize to implement "multiple communicating services" pattern in microservices branch.

Replaced by #80.


Howto use role's variables?

Describe the bug
Cannot use variables with the dot inside.
To Reproduce
Have this in my Playbook:
  tasks:
    - include_role:
        name: jakoblichterfeld.winehq
      vars:
        winehq.install_playonlinux: false

But Ansible (version is: ansible [core 2.17.6]) doesn't like these "nested" variable with the dot:
ERROR! Invalid variable name in vars specified for IncludeRole: 'winehq.install_playonlinux' is not a valid variable name. 'winehq.install_playonlinux' is not a valid variable name

The error appears to be in '/Users/12345/private/ansible/plus/plus.yaml': line 23, column 9, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

      vars:
        winehq.install_playonlinux: false
        ^ here

If there is a different syntax to be used in the playbook, it may be worth mentioning in the documentation? At least I never have used a role before which used that, so I have no idea how to use this correctly.
Information:
harenber@dhcp-109-37 plus % ansible --version
ansible [core 2.17.6]
  config file = None
  configured module search path = ['/Users/12345/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/homebrew/Cellar/ansible/10.6.0_1/libexec/lib/python3.12/site-packages/ansible
  ansible collection location = /Users/12345/.ansible/collections:/usr/share/ansible/collections
  executable location = /opt/homebrew/bin/ansible
  python version = 3.12.7 (main, Oct  1 2024, 02:05:46) [Clang 16.0.0 (clang-16<IP_ADDRESS>)] (/opt/homebrew/Cellar/ansible/10.6.0_1/libexec/bin/python)
  jinja version = 3.1.4
  libyaml = True

Thanks for reporting.
      vars:
        winehq:
           install_playonlinux: false


Class 'Container' not found

Following your Single example....i've installed via Composer (first time using Composer), but am encountering a Fatal error:
Where did I go wrong?
PHP Fatal error:  Class 'Container' not found in /Applications/MAMP/htdocs/dotmailer/index.php on line 5

Hi @stoopkid1, you must use the correct namaspace
<?php
namespace DotMailer\Api;

$resources = Container::newResources($credentials);

or instantiate with the full class name
<?php
$resources = \DotMailer\Api\Container::newResources($credentials);

I had the same issue it is not a big deal to add
namespace DotMailer\Api;
to your first example...

With this in mind, how would i catch this exception for example?
`namespace DotMailer\Api\DataTypes;
$contact = new ApiContact();
$contact->email = $_POST['email'];
$contact->emailtype = $_POST['email_type'];
try {
$contact = $resources->PostContacts('invalid input');
} catch (Exception $e) {
echo $e->getMessage();
}`


compare size with axios

✔ Thanks for the suggestion! The comparison has been added and will be included with the NPM package in the next update.


Support span logs

lgtm. Why are the tests failing?

@song-hao, I was expecting all comments to be addressed before merging this one

@song-hao, I was expecting all comments to be addressed before merging this one

@ustinov What's left


How to read secret file after it's declared

I might be fundamentally misunderstanding how to use this tool so please bear with. I have worked through the examples, I'm using a flake based setup and in my configuration.nix have set sops.secrets.mysecret = {}; and can see that at /run/secrets/mysecret exists with the correct value. Later in my configuration, I'm trying to read the contents of the secret file with builtins.readFile "${config.sops.secrets.mysecret.path}" but I get the error access to path /run/secrets/myexample is forbidden in restricted mode. I'm trying to read the file because I want to use it's contents in some string interpolation but maybe that's not the correct usage of sops-nix? I also tried neededForUsers with the same result. Is sops-nix limited to just passing the value of secret paths into path options/configs strings rather than decrypting exposing the secrets during build time?

You cannot read secrets with nix because this is at evaluation time. If you need this you need to keep those files unencrypted but than its world-readable to any user on the system. You can only read them at runtime on the system you deploy the secrets to from /run/secrets/. If you want to interpolate secrets into configuration files you can use sed or envsubst in the preStart phase of your service: https://github.com/NixOS/nixpkgs/blob/0699530f08290f34c532beedd66046825d9756fa/nixos/modules/services/monitoring/telegraf.nix#L69

You can checkout the module https://github.com/Mic92/sops-nix/blob/0e0dcc74bae23c7ef7fb6251c43c277b827e8c34/modules/sops/default.nix#L297
It shows that secrets are only decrypted in the activation phase, which is part of switch-to-configuration


Documentation builds with errors

Issue Summary
Building the docs, while resulting in a working build, seems to raise some errors due to missing Python reference targets.
wagtail/docs/advanced_topics/api/v2/configuration.md:45: WARNING: py:class reference target not found: wagtail.api.v2.views.PagesAPIViewSet
wagtail/docs/advanced_topics/api/v2/configuration.md:46: WARNING: py:class reference target not found: wagtail.images.api.v2.views.ImagesAPIViewSet
wagtail/docs/advanced_topics/api/v2/configuration.md:47: WARNING: py:class reference target not found: wagtail.documents.api.v2.views.DocumentsAPIViewSet
wagtail/docs/advanced_topics/api/v2/configuration.md:48: WARNING: py:class reference target not found: wagtail.contrib.redirects.api.RedirectsAPIViewSet
wagtail/wagtail/documents/__init__.py:docstring of wagtail.documents.get_document_model:1: WARNING: py:class reference target not found: wagtail.documents.models.Document
wagtail/wagtail/images/__init__.py:docstring of wagtail.images.get_image_model:1: WARNING: py:class reference target not found: wagtail.images.models.Image
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.get_rendition:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.get_rendition:1: WARNING: py:class reference target not found: wagtail.images.models.AbstractRendition
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.find_existing_rendition:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.find_existing_rendition:1: WARNING: py:class reference target not found: wagtail.images.models.AbstractRendition
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.create_rendition:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.create_rendition:1: WARNING: py:class reference target not found: wagtail.images.models.AbstractRendition
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.get_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.get_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.AbstractRendition
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.find_existing_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.find_existing_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.find_existing_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.AbstractRendition
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.create_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.create_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.create_renditions:1: WARNING: py:class reference target not found: wagtail.images.models.AbstractRendition
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.generate_rendition_file:1: WARNING: py:class reference target not found: wagtail.images.models.Filter
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.generate_rendition_file:1: WARNING: py:class reference target not found: django.core.files.base.File
wagtail/wagtail/images/models.py:docstring of wagtail.images.models.AbstractImage.generate_rendition_file:1: WARNING: py:class reference target not found: django.core.files.base.File
wagtail/docs/extending/custom_account_settings.md:10: WARNING: py:class reference target not found: wagtail.users.models.UserProfile
wagtail/docs/extending/custom_account_settings.md:57: WARNING: py:class reference target not found: wagtail.users.models.UserProfile
wagtail/docs/reference/contrib/routablepage.md:: WARNING: py:attr reference target not found: wagtail.models.Page.url
wagtail/wagtail/models/__init__.py:docstring of wagtail.models.Page.route_for_request:1: WARNING: py:class reference target not found: HttpRequest
wagtail/wagtail/models/__init__.py:docstring of wagtail.models.Page.route_for_request:1: WARNING: py:class reference target not found: RouteResult
wagtail/wagtail/models/__init__.py:docstring of wagtail.models.Page.find_for_request:1: WARNING: py:class reference target not found: HttpRequest
wagtail/wagtail/models/__init__.py:docstring of wagtail.models.Page.update_aliases:1: WARNING: py:class reference target not found: PageRevision
wagtail/wagtail/models/__init__.py:docstring of wagtail.models.Page.update_aliases:1: WARNING: py:class reference target not found: optional
wagtail/docs/reference/pages/model_reference.md:497: WARNING: py:class reference target not found: wagtail.models.Locale
wagtail/docs/reference/pages/model_reference.md:784: WARNING: py:meth reference target not found: wagtail.models.RevisionsManager.for_instance
wagtail/docs/reference/pages/model_reference.md:1256: WARNING: py:meth reference target not found: LogEntryManger.log_action
wagtail/docs/reference/pages/panels.md:283: WARNING: py:class reference target not found: wagtail.contrib.forms.models.AbstractForm
wagtail/wagtail/blocks/field_block.py:docstring of wagtail.blocks.field_block.FieldBlock:1: WARNING: py:class reference target not found: wagtail.blocks.base.Block
wagtail/wagtail/blocks/field_block.py:docstring of wagtail.blocks.field_block.ChoiceBlock:1: WARNING: py:class reference target not found: wagtail.blocks.field_block.BaseChoiceBlock
wagtail/wagtail/blocks/field_block.py:docstring of wagtail.blocks.field_block.MultipleChoiceBlock:1: WARNING: py:class reference target not found: wagtail.blocks.field_block.BaseChoiceBlock
wagtail/wagtail/blocks/field_block.py:docstring of wagtail.blocks.field_block.PageChooserBlock:1: WARNING: py:class reference target not found: wagtail.blocks.field_block.ChooserBlock
wagtail/wagtail/documents/blocks.py:docstring of wagtail.documents.blocks.DocumentChooserBlock:1: WARNING: py:class reference target not found: wagtail.documents.views.chooser.BaseDocumentChooserBlock
wagtail/wagtail/images/blocks.py:docstring of wagtail.images.blocks.ImageChooserBlock:1: WARNING: py:class reference target not found: wagtail.blocks.field_block.ChooserBlock
wagtail/wagtail/snippets/blocks.py:docstring of wagtail.snippets.blocks.SnippetChooserBlock:1: WARNING: py:class reference target not found: wagtail.blocks.field_block.ChooserBlock
wagtail/wagtail/blocks/static_block.py:docstring of wagtail.blocks.static_block.StaticBlock:1: WARNING: py:class reference target not found: wagtail.blocks.base.Block
wagtail/wagtail/blocks/struct_block.py:docstring of wagtail.blocks.struct_block.StructBlock:1: WARNING: py:class reference target not found: wagtail.blocks.struct_block.BaseStructBlock
wagtail/wagtail/blocks/list_block.py:docstring of wagtail.blocks.list_block.ListBlock:1: WARNING: py:class reference target not found: wagtail.blocks.base.Block
wagtail/wagtail/blocks/stream_block.py:docstring of wagtail.blocks.stream_block.StreamBlock:1: WARNING: py:class reference target not found: wagtail.blocks.stream_block.BaseStreamBlock
wagtail/docs/reference/viewsets.md:67: WARNING: py:attr reference target not found: django.db.models.Options.model_name
wagtail/docs/releases/0.6.rst:31: WARNING: py:class reference target not found: wagtail.contrib.wagtailroutablepage.models.RoutablePageMixin
wagtail/docs/releases/1.0.rst:203: WARNING: py:class reference target not found: wagtail.contrib.wagtailroutablepage.models.RoutablePageMixin
wagtail/docs/releases/1.0.rst:203: WARNING: py:attr reference target not found: wagtail.contrib.wagtailroutablepage.models.RoutablePageMixin.subpage_urls
wagtail/docs/releases/1.1.rst:23: WARNING: py:mod reference target not found: wagtail.wagtailsearch
wagtail/docs/releases/1.1.rst:23: WARNING: py:mod reference target not found: wagtail.contrib.wagtailsearchpromotions
wagtail/docs/releases/1.1.rst:31: WARNING: py:mod reference target not found: wagtail.contrib.wagtailapi
wagtail/docs/releases/1.1.rst:103: WARNING: py:mod reference target not found: wagtail.wagtailsearch
wagtail/docs/releases/1.1.rst:108: WARNING: py:mod reference target not found: wagtail.contrib.wagtailsearchpromotions
wagtail/docs/releases/1.1.rst:119: WARNING: py:mod reference target not found: wagtail.contrib.wagtailsearchpromotions.models.SearchPromotion
wagtail/docs/releases/1.11.rst:124: WARNING: py:meth reference target not found: wagtail.core.models.Page.get_url_parts
wagtail/docs/releases/1.11.rst:124: WARNING: py:meth reference target not found: wagtail.core.models.Page.get_url
wagtail/docs/releases/1.11.rst:124: WARNING: py:meth reference target not found: wagtail.core.models.Page.get_full_url
wagtail/docs/releases/1.11.rst:124: WARNING: py:meth reference target not found: wagtail.core.models.Page.relative_url
wagtail/docs/releases/1.2.rst:118: WARNING: py:meth reference target not found: wagtail.core.models.Page.copy
wagtail/docs/releases/1.2.rst:187: WARNING: py:meth reference target not found: wagtail.core.models.Page.get_latest_revision_as_page
wagtail/docs/releases/1.6.1.rst:25: WARNING: py:meth reference target not found: wagtail.core.models.Page.can_create_at
wagtail/docs/releases/1.8.rst:73: WARNING: py:meth reference target not found: wagtail.core.query.PageQuerySet.in_site
wagtail/docs/releases/2.9.rst:97: WARNING: py:class reference target not found: wagtail.core.middleware.SiteMiddleware
wagtail/docs/releases/5.2.md:246: WARNING: py:attr reference target not found: wagtail.models.Revision.submitted_for_moderation
wagtail/docs/releases/5.2.md:247: WARNING: py:attr reference target not found: wagtail.models.Revision.submitted_revisions
wagtail/docs/releases/5.2.md:248: WARNING: py:meth reference target not found: wagtail.models.Revision.approve_moderation
wagtail/docs/releases/5.2.md:249: WARNING: py:meth reference target not found: wagtail.models.Revision.reject_moderation
wagtail/docs/topics/snippets/features.md:89: WARNING: py:class reference target not found: wagtail.search.index.Indexed
wagtail/docs/topics/snippets/features.md:329: WARNING: py:class reference target not found: taggit.manager.TaggableManager
wagtail/docs/topics/snippets/features.md:329: WARNING: py:class reference target not found: modelcluster.contrib.taggit.ClusterTaggableManager

Steps to Reproduce

Follow the steps to build the docs https://docs.wagtail.org/en/stable/contributing/developing.html#compiling-the-documentation
Observe the console output

Any other relevant information. For example, why do you consider this a bug and what did you expect to happen instead?

The build should complete without errors.

Working on this

Some of the missing references errors are due to a few reasons:

Legacy code that has been removed, e.g. moderation methods in wagtail.models.Revision
Wagtail's classes/functions that are undocumented (they don't have an entry in the reference docs)
Classes/functions from external library that don't have an intersphinx mapping linked in our Sphinx config
Potentially invalid markup in the docs

For legacy and undocumented references, we should just use normal inline code (``) instead of using the Sphinx reference directive (e.g. {class}). For external libraries, if they have an intersphinx object inventory, we should add them to our intersphinx_mapping and fix the link as necessary. If they don't, either convert them to regular links or use normal inline code. For invalid markup, we should fix them.
Once we've resolved all the errors, we should look into making readthedocs fail loudly if the build completes with non-zero code exit code, so we can prevent new errors in the future. With our current config, we already get non-zero exit code as of #11503, but for some reason the RTD build is still marked as successful. We might need to customise the build to get the desired behaviour.
Anyone can contribute to this. View our contributing guidelines, add a comment to the issue once you’re ready to start.

I have looked into the issue and tried to fix it. But now 35 still remain. They have to deal with sphinx auto doc. I deep dive into it and found the issue is with auto doc issue, and It has some proposed solutions that we can consider with typing. Most of issues have to be deal with autodoc typing and fast forward references.

I have an initial pull request with some changes but only some of the solution. I need help tackling other warnings and feedback on my suggested changes for others. Should I make a pull request to have feedback and suggestions or work on local first?

Hi @HimanshuGarg47 - thanks for working on this! A pull request with just the ones you've managed to fix so far would be very much appreciated.

Hi @HimanshuGarg47 and @gasman - @khalidsafwany want to take what you've started and work it during sprint:Arnhem2024, OK? But we don't want to step on your toes if you're in the middle of it, lemme know.

Thanks @shentonfreude (and @khalidSafwany)! Since @laymonage gave the current PR a thorough review, I think he's best placed to say what else is remaining on it, if anything.
I see that a lot of the fixes are simply changing a class/method reference to a plain "code snippet in backticks", and I was worried that we might be losing useful information by doing that - but having checked a few of them (such as the references to wagtail.api.v2.views in docs/advanced_topics/api/v2/configuration.md), there isn't anywhere useful they can point to (there aren't any reference docs for those classes, and very few docstrings in the code, so adding reference docs wouldn't add much value). Presumably we were just using that syntax to denote "this is a class / method" even if the reference didn't point anywhere, and newer sphinx versions have become pickier about that - so changing it to a plain code snippet is indeed the right thing to do. It would be good to have someone independently confirm that that's the case for all the items being changed here - but again, maybe @laymonage has done that already...?

Hey all, sorry I haven't had the chance to look at the PR again. To help move this forward during the sprint, I'd suggest building out the docs using the branch from #12012 (and check if there are any of my suggestions that haven't been applied), and see if there are still errors. If there are, then we can make a new PR with additional fixes until the docs build without errors. I'll be sure to credit everyone involved when adding the release notes. Thanks!

Is anyone actually using the sphinxcontrib.spelling/enchant spellchecker? Given the results I just got after figuring out how to get it to run ("WARNING: Found 2547 misspelled words" with lots of false positives, like parts of contractions), it doesn't seem like it's providing much value to anyone. Perhaps we should just remove the dependency and eliminate that bit of friction?

Fixed in #12044

I would like to reopen this issue. I wasn't able to compile the documentation for our latest development version without installing the newest pyenchant release candidate. The pip install pyenchant==3.3.0rc1 command resolved the issue for me but this doesn't seem like a good long-term solution to me.
Would it be worth including a note in the documentation to prompt people to use the rc version of the package as a temporary solution? Or do we want to endeavour to remove the spellcheck feature instead?

Thanks Meagen, let's continue that in #12254.


added Firebase setup instructions to README

Added Firebase setup instructions
Contributing to Twilio

All third-party contributors acknowledge that any contributions they provide will be made under the same open-source license that the open-source project is provided under.

[ ] I acknowledge that all my contributions will be made under the project's license.

Incomplete instructions


Shell integration failed to active

Does this issue occur when all extensions are disabled?: Yes/No

VS Code Version: 1.74.0
OS Version: windows 11

Steps to Reproduce:

Shell integration failed to active

I can reproduce on every system with VSCode.
This is a very long-standing issue that has been reported many times but never fixed.

It looks like your report is missing some important information, See this wiki page for more info on how to report actionable terminal issues.
/label "info-needed" terminal

https://github.com/microsoft/vscode/issues/163830
https://github.com/microsoft/vscode/issues/163091
https://github.com/microsoft/vscode/issues/151163

Since y'all keep closing the numerous reports of this issue, I just assume there is no intention of fixing it.
Also, perhaps you should create a known-issue Wiki and explain that shell integration activation is intended to only work with pwsh.exe and that y'all know that there is a bug where the error message appears when using other shells....

Hello.
Yesterday I updated to vscode 1.74.0 and started to get the same error. The zsh terminal is not working as expected.
Version: 1.74.0 (Universal)
Commit: 5235c6bb189b60b01b1f49062f4ffa42384f8c91
Date: 2022-12-05T16:43:37.594Z
Electron: 19.1.8
Chromium: 102.0.5005.167
Node.js: 16.14.2
V8: <IP_ADDRESS>-electron.0
OS: Darwin arm64 21.6.0
Sandboxed: Yes

Hello.
Yesterday I updated to vscode 1.74.0 and started to get the same error. The zsh terminal is not working as expected.
Version: 1.74.0 (Universal)
Commit: 5235c6bb189b60b01b1f49062f4ffa42384f8c91
Date: 2022-12-05T16:43:37.594Z
Electron: 19.1.8
Chromium: 102.0.5005.167
Node.js: 16.14.2
V8: <IP_ADDRESS>-electron.0
OS: Darwin arm64 21.6.0
Sandboxed: Yes

Hey @Tyriar, this issue might need further attention.
@F-OlO-Y, you can help us out by closing this issue if the problem no longer exists, or adding more information.

Hey @Tyriar, this issue might need further attention.
@F-OlO-Y, you can help us out by closing this issue if the problem no longer exists, or adding more information.


Question: UNAVAILABLE vs RESOURCE_EXHAUSTED when rate limited (OVER_LIMIT)

I am seeing grpc-status: 14 (UNAVAILABLE) in the responses from Envoy when a request was "rate limited" (ie. rate limiting service responded with OVER_LIMIT).
HTTP to gRPC Status Code Mapping states that the HTTP Status Code 429 should be mapped to UNAVAILABLE.
But Google Cloud's documentation suggests mapping it to RESOURCE_EXHAUSTED.
Returning a RESOURCE_EXHAUSTED status code may potentially make things easier, especially if a client side has Retries configured for the UNAVAILABLE status codes.
I am trying to understand if returning UNAVAILABLE is the correct behavior or I may have configured something incorrectly?
And also, If that is the correct behavior (including the backwards compatibility reasons) will it make sense to have the response status code configurable somewhere in the Rate Limit Service Configuration?

Right now Envoy follows the status code mapping as specified, so it is the expected behavior at least as the spec defines it.
We can consider having the mappings be configurable I suppose?


Fix javadoc of ArmeriaSettings.java

Motivation:
ArmeriaSettings.internalServices is not List type.
Result:
omitted

Thanks! ❤