A TypeAhead widget for Flutter, where you can show suggestions to users as they type

Related tags

UI flutter_typeahead
Overview

Flutter TypeAhead

A TypeAhead (autocomplete) widget for Flutter, where you can show suggestions to users as they type

Features

  • Shows suggestions in an overlay that floats on top of other widgets
  • Allows you to specify what the suggestions will look like through a builder function
  • Allows you to specify what happens when the user taps a suggestion
  • Accepts all the parameters that traditional TextFields accept, like decoration, custom TextEditingController, text styling, etc.
  • Provides two versions, a normal version and a FormField version that accepts validation, submitting, etc.
  • Provides high customizability; you can customize the suggestion box decoration, the loading bar, the animation, the debounce duration, etc.

Installation

See the installation instructions on pub.

Note: As for Typeahead 3.X this package is based on Dart 2.12 (null-safety). You may also want to explore the new built in Flutter 2 widgets that have similar behavior.

Usage examples

You can import the package with:

import 'package:flutter_typeahead/flutter_typeahead.dart';

For Cupertino users import:

import 'package:flutter_typeahead/cupertino_flutter_typeahead.dart';

Use it as follows:

Material Example 1:

TypeAheadField(
  textFieldConfiguration: TextFieldConfiguration(
    autofocus: true,
    style: DefaultTextStyle.of(context).style.copyWith(
      fontStyle: FontStyle.italic
    ),
    decoration: InputDecoration(
      border: OutlineInputBorder()
    )
  ),
  suggestionsCallback: (pattern) async {
    return await BackendService.getSuggestions(pattern);
  },
  itemBuilder: (context, suggestion) {
    return ListTile(
      leading: Icon(Icons.shopping_cart),
      title: Text(suggestion['name']),
      subtitle: Text('\$${suggestion['price']}'),
    );
  },
  onSuggestionSelected: (suggestion) {
    Navigator.of(context).push(MaterialPageRoute(
      builder: (context) => ProductPage(product: suggestion)
    ));
  },
)

In the code above, the textFieldConfiguration property allows us to configure the displayed TextField as we want. In this example, we are configuring the autofocus, style and decoration properties.

The suggestionsCallback is called with the search string that the user types, and is expected to return a List of data either synchronously or asynchronously. In this example, we are calling an asynchronous function called BackendService.getSuggestions which fetches the list of suggestions.

The itemBuilder is called to build a widget for each suggestion. In this example, we build a simple ListTile that shows the name and the price of the item. Please note that you shouldn't provide an onTap callback here. The TypeAhead widget takes care of that.

The onSuggestionSelected is a callback called when the user taps a suggestion. In this example, when the user taps a suggestion, we navigate to a page that shows us the information of the tapped product.

Material Example 2:

Here's another example, where we use the TypeAheadFormField inside a Form:

final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final TextEditingController _typeAheadController = TextEditingController();
String _selectedCity;
...
Form(
  key: this._formKey,
  child: Padding(
    padding: EdgeInsets.all(32.0),
    child: Column(
      children: <Widget>[
        Text(
          'What is your favorite city?'
        ),
        TypeAheadFormField(
          textFieldConfiguration: TextFieldConfiguration(
            controller: this._typeAheadController,
            decoration: InputDecoration(
              labelText: 'City'
            )
          ),          
          suggestionsCallback: (pattern) {
            return CitiesService.getSuggestions(pattern);
          },
          itemBuilder: (context, suggestion) {
            return ListTile(
              title: Text(suggestion),
            );
          },
          transitionBuilder: (context, suggestionsBox, controller) {
            return suggestionsBox;
          },
          onSuggestionSelected: (suggestion) {
            this._typeAheadController.text = suggestion;
          },
          validator: (value) {
            if (value.isEmpty) {
              return 'Please select a city';
            }
          },
          onSaved: (value) => this._selectedCity = value,
        ),
        SizedBox(height: 10.0,),
        RaisedButton(
          child: Text('Submit'),
          onPressed: () {
            if (this._formKey.currentState.validate()) {
              this._formKey.currentState.save();
              Scaffold.of(context).showSnackBar(SnackBar(
                content: Text('Your Favorite City is ${this._selectedCity}')
              ));
            }
          },
        )
      ],
    ),
  ),
)

Here, we assign to the controller property of the textFieldConfiguration a TextEditingController that we call _typeAheadController. We use this controller in the onSuggestionSelected callback to set the value of the TextField to the selected suggestion.

The validator callback can be used like any FormField.validator function. In our example, it checks whether a value has been entered, and displays an error message if not. The onSaved callback is used to save the value of the field to the _selectedCity member variable.

The transitionBuilder allows us to customize the animation of the suggestion box. In this example, we are returning the suggestionsBox immediately, meaning that we don't want any animation.

Cupertino Example:

Please see the Cupertino code in the example project.

Known Issues

Animations

Placing TypeAheadField in widgets with animations may cause the suggestions box to resize incorrectly. Since animation times are variable, this has to be corrected manually at the end of the animation. You will need to add a SuggestionsBoxController described below and the following code for the AnimationController.

void Function(AnimationStatus) _statusListener;

@override
void initState() {
  super.initState();
  _statusListener = (AnimationStatus status) {
    if (status == AnimationStatus.completed ||
        status == AnimationStatus.dismissed) {
      _suggestionsBoxController.resize();
    }
  };

  _animationController.addStatusListener(_statusListener);
}

@override
  void dispose() {
    _animationController.removeStatusListener(_statusListener);
    _animationController.dispose();
    super.dispose();
}

Dialogs

There is a known issue with opening dialogs where the suggestions box will sometimes appear too small. This is a timing issue caused by the animations described above. Currently, showDialog has a duration of 150 ms for the animations. TypeAheadField has a delay of 170 ms to compensate for this. Until the end of the animation can be properly detected and fixed using the solution above, this temporary fix will work most of the time. If the suggestions box is too small, closing and reopening the keyboard will usually fix the issue.

Cupertino

The Cupertino classes in TypeAhead are still new. There are also differences in the Cupertino widgets vs the Material ones. Some behavior will not translate when moving between the two.

Customizations

TypeAhead widgets consist of a TextField and a suggestion box that shows as the user types. Both are highly customizable

Customizing the TextField

You can customize the text field using the textFieldConfiguration property. You provide this property with an instance of TextFieldConfiguration, which allows you to configure all the usual properties of TextField, like decoration, style, controller, focusNode, autofocus, enabled, etc.

Customizing the suggestions box

TypeAhead provides default configurations for the suggestions box. You can, however, override most of them. This is done by passing a SuggestionsBoxDecoration to the suggestionsBoxDecoration property.

Use the offsetX property in SuggestionsBoxDecoration to shift the suggestions box along the x-axis. You may also pass BoxConstraints to constraints in SuggestionsBoxDecoration to adjust the width and height of the suggestions box. Using the two together will allow the suggestions box to be placed almost anywhere.

Customizing the loader, the error and the "no items found" message

You can use the loadingBuilder, errorBuilder and noItemsFoundBuilder to customize their corresponding widgets. For example, to show a custom error widget:

errorBuilder: (BuildContext context, Object error) =>
  Text(
    '$error',
    style: TextStyle(
      color: Theme.of(context).errorColor
    )
  )

By default, the suggestions box will maintain the old suggestions while new suggestions are being retrieved. To show a circular progress indicator during retrieval instead, set keepSuggestionsOnLoading to false.

Hiding the suggestions box

There are three scenarios when you can hide the suggestions box.

Set hideOnLoading to true to hide the box while suggestions are being retrieved. This will also ignore the loadingBuilder. Set hideOnEmpty to true to hide the box when there are no suggestions. This will also ignore the noItemsFoundBuilder. Set hideOnError to true to hide the box when there is an error retrieving suggestions. This will also ignore the errorBuilder.

By default, the suggestions box will automatically hide when the keyboard is hidden. To change this behavior, set hideSuggestionsOnKeyboardHide to false.

Customizing the animation

You can customize the suggestion box animation through 3 parameters: the animationDuration, the animationStart, and the transitionBuilder.

The animationDuration specifies how long the animation should take, while the animationStart specified what point (between 0.0 and 1.0) the animation should start from. The transitionBuilder accepts the suggestionsBox and animationController as parameters, and should return a widget that uses the animationController to animate the display of the suggestionsBox. For example:

transitionBuilder: (context, suggestionsBox, animationController) =>
  FadeTransition(
    child: suggestionsBox,
    opacity: CurvedAnimation(
      parent: animationController,
      curve: Curves.fastOutSlowIn
    ),
  )

This uses FadeTransition to fade the suggestionsBox into the view. Note how the animationController was provided as the parent of the animation.

In order to fully remove the animation, transitionBuilder should simply return the suggestionsBox. This callback could also be used to wrap the suggestionsBox with any desired widgets, not necessarily for animation.

Customizing the debounce duration

The suggestions box does not fire for each character the user types. Instead, we wait until the user is idle for a duration of time, and then call the suggestionsCallback. The duration defaults to 300 milliseconds, but can be configured using the debounceDuration parameter.

Customizing the offset of the suggestions box

By default, the suggestions box is displayed 5 pixels below the TextField. You can change this by changing the suggestionsBoxVerticalOffset property.

Customizing the decoration of the suggestions box

You can also customize the decoration of the suggestions box using the suggestionsBoxDecoration property. For example, to remove the elevation of the suggestions box, you can write:

suggestionsBoxDecoration: SuggestionsBoxDecoration(
  elevation: 0.0
)

Customizing the growth direction of the suggestions list

By default, the list grows towards the bottom. However, you can use the direction property to customize the growth direction to be one of AxisDirection.down or AxisDirection.up, the latter of which will cause the list to grow up, where the first suggestion is at the bottom of the list, and the last suggestion is at the top.

Set autoFlipDirection to true to allow the suggestions list to automatically flip direction whenever it detects that there is not enough space for the current direction. This is useful for scenarios where the TypeAheadField is in a scrollable widget or when the developer wants to ensure the list is always viewable despite different user screen sizes.

Controlling the suggestions box

Manual control of the suggestions box can be achieved by creating an instance of SuggestionsBoxController and passing it to the suggestionsBoxController property. This will allow you to manually open, close, toggle, or resize the suggestions box.

For more information

Visit the API Documentation

Team:

AbdulRahman AlHamali S McDowall Kenneth Liang

Shout out to the contributors!

This project is the result of the collective effort of contributors who participated effectively by submitting pull requests, reporting issues, and answering questions. Thank you for your proactiveness, and we hope flutter_typeahead made your lifes at least a little easier!

How you can help

Contribution Guidelines

Comments
  • 0.5 broke something pretty fundamental

    0.5 broke something pretty fundamental

    On 0.4.X this work working just fine -- I upgraded to 0.5.0 and now for the same Widgets I am getting the below stack trace (and red screen of death on the phone).

    Any ideas?

    ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
    flutter: The following assertion was thrown building _SuggestionsList<dynamic>(dirty, state:
    flutter: _SuggestionsListState<dynamic>#feb23(ticker inactive)):
    flutter: BoxConstraints has non-normalized height constraints.
    flutter: The offending constraints were:
    flutter:   BoxConstraints(w=Infinity, 358.4<=h<=300.0; NOT NORMALIZED)
    flutter:
    flutter: When the exception was thrown, this was the stack:
    flutter: #0      BoxConstraints.debugAssertIsValid.<anonymous closure>.throwError (package:flutter/src/rendering/box.dart:504:9)
    flutter: #1      BoxConstraints.debugAssertIsValid.<anonymous closure> (package:flutter/src/rendering/box.dart:540:19)
    flutter: #2      BoxConstraints.debugAssertIsValid (package:flutter/src/rendering/box.dart:551:6)
    flutter: #3      new ConstrainedBox (package:flutter/src/widgets/basic.dart:1884:27)
    flutter: #4      _SuggestionsListState.build (package:flutter_typeahead/flutter_typeahead.dart:950:14)
    flutter: #5      StatefulElement.build (package:flutter/src/widgets/framework.dart:3809:27)
    flutter: #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3721:15)
    flutter: #7      Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
    flutter: #8      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
    flutter: #9      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3848:11)
    flutter: #10     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
    flutter: #11     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
    flutter: #12     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
    flutter: #13     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4860:14)
    flutter: #14     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
    flutter: #15     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
    flutter: #16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
    flutter: #17     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
    flutter: #18     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
    flutter: #19     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
    flutter: #20     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4047:11)
    flutter: #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
    flutter: #22     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
    flutter: #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3732:16)
    flutter: #24     Element.rebuild (package:flutter/src/widgets/framework.dart:3547:5)
    flutter: #25     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3701:5)
    flutter: #26     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3848:11)
    flutter: #27     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3696:5)
    flutter: #28     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2950:14)
    flutter: #29     Element.updateChild (package:flutter/src/widgets/framework.dart:2753:12)
    flutter: #30     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:4643:32)
    
    opened by sjmcdowall 22
  • Hide suggestions box completely

    Hide suggestions box completely

    Is there a way to hide the suggestions box completely if no suggestions have been found? When I use noItemsFoundBuilder: (context) => Container(), I still get the empty box.

    opened by fsobanski 16
  • Type error

    Type error

    I'm not sure if it's the Typeahead bug or Dart bug.

    Here's the repro case:

    import 'dart:async';
    import 'dart:math';
    
    import 'package:flutter/material.dart';
    import 'package:flutter_typeahead/flutter_typeahead.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'flutter_typeahead demo',
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return DefaultTabController(
          length: 1,
          child: Scaffold(
              appBar: AppBar(
                title: TabBar(tabs: [
                  Tab(
                    text: 'Example 1: Navigation',
                  ),
                ]),
              ),
              body: TabBarView(children: [NavigationExample()])),
        );
      }
    }
    
    enum Skill {
        Math,
        English,
        Physics,
        Sports,
    }
    
    class NavigationExample extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Padding(
          padding: EdgeInsets.all(32.0),
          child: Column(
            children: <Widget>[
              SizedBox(
                height: 10.0,
              ),
              TypeAheadField<Skill>(
                textFieldConfiguration: TextFieldConfiguration(
                  autofocus: true,
                  decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      hintText: 'Got skillz?'),
                ),
                suggestionsCallback: (pattern) => Skill.values,
                itemBuilder: (context, suggestion) =>
                  ListTile(title: Text(suggestion.toString())),
                onSuggestionSelected: (suggestion) {
                    print("Selected: ${suggestion.toString()}");
                },
              ),
            ],
          ),
        );
      }
    }
    

    If you run it as is it fails with exception

    I/flutter (10939): The following assertion was thrown building
    I/flutter (10939): _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#c54a2](dirty, state: _OverlayEntryState#02217):
    I/flutter (10939): type '(BuildContext, Skill) => ListTile' is not a subtype of type '(BuildContext, dynamic) =>
    I/flutter (10939): Widget'
    I/flutter (10939): Either the assertion indicates an error in the framework itself, or we should provide substantially
    I/flutter (10939): more information in this error message to help you determine and fix the underlying cause.
    I/flutter (10939): In either case, please report this assertion by filing a bug on GitHub:
    I/flutter (10939):   https://github.com/flutter/flutter/issues/new?template=BUG.md
    I/flutter (10939): When the exception was thrown, this was the stack:
    I/flutter (10939): #0      _TypeAheadFieldState._initOverlayEntry.<anonymous closure> (package:flutter_typeahead/flutter_typeahead.dart:697:33)
    I/flutter (10939): #1      _OverlayEntryState.build (package:flutter/src/widgets/overlay.dart:170:25)
    

    If you remove <Skill> from the call to TypeAheadField<Skill>(...) it works fine.

    Flutter 1.1.9 • channel dev • https://github.com/flutter/flutter.git
    Framework • revision 1407091bfb (5 days ago) • 2019-01-08 20:40:19 -0800
    Engine • revision e5ec3cf3ea
    Tools • Dart 2.1.1 (build 2.1.1-dev.0.1 2cb346bd0c)
    
    opened by kika 16
  • TypeAhead in floating widgets

    TypeAhead in floating widgets

    The current way of implementing typeahead widget would work correctly for fixed text field, however, for a floating widget like dialogs, the behavior would be incorrect.

    More specifically, when the keyboard popped up, the typeahead would first calculate the height of the typeahead widget, and then the dialog would float to its right position. This would cause the size of the widget to be too small.

    My current workaround is to increase the waiting time in _waitChangeMetrics so that the dialog would float to the right position and then the height would be calculated correctly.

    I don't know if currently there's a better way to address this issue.

    opened by superfashi 13
  • Various interaction issues with 1.0.5 and the keyboard ...

    Various interaction issues with 1.0.5 and the keyboard ...

    screen shot 2019-02-28 at 10 22 32 am Our users are trying our app and we have some pretty critical UX issues that are appearing that we need some help with quickly .. (we hope to launch next week).

    @KaYBlitZ -- any chance you can look at these? THey are all keyboard related.. and I think part of the solution IS going to use that 3rd party keyboard detection thing ..

    Problem 1 -- on iOS when we enter a screen with a Typeahead the keyboard isn't appearing (see screen shot on an XR) and there is no way to make it appear since the focus is already in the TextField (that anyone can figure out). The keyboard DOES appear on Android .. %K on iOS causes the keyboard to appear but -- shouldn't it always appear on entry / focus ??

    1. On Android if I click on the TextField the keyboard reappears .. this does not happen on iOS

    2. If keyboard is open -- no way to scroll the list to select an entry hidden by keyboard ..

    3. If we implement the "close list on keyboard close" -- how would the user EVER scroll the list? I thought we recalculated the "display" size to accomodate the keyboard being open so the list could scroll?

    4. Assuming we fix 4, then we need to implement the "on keyboard close" dismiss the suggestions box option. We need this because there are some critical buttons being hidden by the suggestions box that allow the user to continue the process but they can't get access to them so we need a way to toggle showing the suggestions box or not .. and not many options on how to do it that I can see.

    Phew.

    /Steve

    opened by sjmcdowall 12
  • Can't use in a CupertinoApp

    Can't use in a CupertinoApp

    Hi, I wanna use this great library in a CupertinoApp. But this exception appears sadly.

    I/flutter ( 4983): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
    I/flutter ( 4983): The following assertion was thrown building TextField(controller:
    I/flutter ( 4983): TextEditingController#13fc5(TextEditingValue(text: ┤├, selection: TextSelection(baseOffset: -1,
    I/flutter ( 4983): extentOffset: -1, affinity: TextAffinity.downstream, isDirectional: false), composing:
    I/flutter ( 4983): TextRange(start: -1, end: -1))), focusNode: FocusNode#caf8a, enabled: true, dirty, state:
    I/flutter ( 4983): _TextFieldState#cb377):
    I/flutter ( 4983): No Material widget found.
    I/flutter ( 4983): TextField widgets require a Material widget ancestor.
    I/flutter ( 4983): In material design, most widgets are conceptually "printed" on a sheet of material. In Flutter's
    I/flutter ( 4983): material library, that material is represented by the Material widget. It is the Material widget
    I/flutter ( 4983): that renders ink splashes, for instance. Because of this, many material library widgets require that
    I/flutter ( 4983): there be a Material widget in the tree above them.
    I/flutter ( 4983): To introduce a Material widget, you can either directly include one, or use a widget that contains
    I/flutter ( 4983): Material itself, such as a Card, Dialog, Drawer, or Scaffold.
    I/flutter ( 4983): The specific widget that could not find a Material ancestor was:
    I/flutter ( 4983):   TextField(controller: TextEditingController#13fc5(TextEditingValue(text: ┤├, selection:
    I/flutter ( 4983):   TextSelection(baseOffset: -1, extentOffset: -1, affinity: TextAffinity.downstream, isDirectional:
    I/flutter ( 4983):   false), composing: TextRange(start: -1, end: -1))), focusNode: FocusNode#caf8a, enabled: true)
    I/flutter ( 4983): The ancestors of this widget were:
    I/flutter ( 4983):   CompositedTransformTarget
    I/flutter ( 4983):   TypeAheadField<Project>
    I/flutter ( 4983):   Padding(padding: EdgeInsets.all(8.0))
    I/flutter ( 4983):   RepaintBoundary-[<1>]
    I/flutter ( 4983):   IndexedSemantics(index: 1)
    I/flutter ( 4983):   NotificationListener<KeepAliveNotification>
    I/flutter ( 4983):   KeepAlive(keepAlive: false)
    I/flutter ( 4983):   AutomaticKeepAlive
    I/flutter ( 4983):   SliverList(delegate: SliverChildListDelegate#07f83(estimated child count: 8))
    I/flutter ( 4983):   MediaQuery(MediaQueryData(size: Size(411.4, 683.4), devicePixelRatio: 2.6, textScaleFactor: 1.0,
    I/flutter ( 4983):   platformBrightness: Brightness.light, padding: EdgeInsets.zero, viewInsets: EdgeInsets.zero,
    I/flutter ( 4983):   alwaysUse24HourFormat: true, accessibleNavigation: falsedisableAnimations: falseinvertColors:
    I/flutter ( 4983):   falseboldText: false))
    I/flutter ( 4983):   SliverPadding(padding: EdgeInsets(0.0, 24.0, 0.0, 0.0))
    I/flutter ( 4983):   Viewport(axisDirection: down, anchor: 0.0, offset: ScrollPositionWithSingleContext#d220e(offset:
    I/flutter ( 4983):   0.0, range: null..null, viewport: 633.4, ScrollableState, ClampingScrollPhysics ->
    I/flutter ( 4983):   BouncingScrollPhysics, IdleScrollActivity#16bbd, ScrollDirection.idle))
    I/flutter ( 4983):   IgnorePointer-[GlobalKey#17bb2](ignoring: false, ignoringSemantics: false)
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   Listener(listeners: [down], behavior: opaque)
    I/flutter ( 4983):   _GestureSemantics
    I/flutter ( 4983):   RawGestureDetector-[LabeledGlobalKey<RawGestureDetectorState>#f3df6]
    I/flutter ( 4983):   _ScrollableScope
    I/flutter ( 4983):   _ScrollSemantics-[GlobalKey#2702b]
    I/flutter ( 4983):   Scrollable(axisDirection: down, physics: ClampingScrollPhysics)
    I/flutter ( 4983):   ListView(scrollDirection: vertical, primary: using primary controller, ClampingScrollPhysics)
    I/flutter ( 4983):   FutureBuilder<Map<String, dynamic>>
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   Builder
    I/flutter ( 4983):   RepaintBoundary-[GlobalKey#248ae]
    I/flutter ( 4983):   IgnorePointer(ignoring: false)
    I/flutter ( 4983):   Stack(alignment: AlignmentDirectional.topStart, fit: passthrough, overflow: clip)
    I/flutter ( 4983):   _CupertinoBackGestureDetector<dynamic>
    I/flutter ( 4983):   DecoratedBox(bg: _CupertinoEdgeShadowDecoration(edgeGradient:
    I/flutter ( 4983):   LinearGradient(AlignmentDirectional(0.9, 0.0), AlignmentDirectional.centerEnd, [Color(0x00000000),
    I/flutter ( 4983):   Color(0x04000000), Color(0x12000000), Color(0x38000000)], [0.0, 0.3, 0.6, 1.0], TileMode.clamp)))
    I/flutter ( 4983):   DecoratedBoxTransition(animation: AnimationController#22083(⏭ 1.000; paused; for
    I/flutter ( 4983):   CupertinoPageRoute<dynamic>(/))➩ProxyAnimation➩Cubic(0.35, 0.91, 0.33,
    I/flutter ( 4983):   0.97)➩DecorationTween(_CupertinoEdgeShadowDecoration(edgeGradient: null) →
    I/flutter ( 4983):   _CupertinoEdgeShadowDecoration(edgeGradient: LinearGradient(AlignmentDirectional(0.9, 0.0),
    I/flutter ( 4983):   AlignmentDirectional.centerEnd, [Color(0x00000000), Color(0x04000000), Color(0x12000000),
    I/flutter ( 4983):   Color(0x38000000)], [0.0, 0.3, 0.6, 1.0],
    I/flutter ( 4983):   TileMode.clamp)))➩_CupertinoEdgeShadowDecoration(edgeGradient:
    I/flutter ( 4983):   LinearGradient(AlignmentDirectional(0.9, 0.0), AlignmentDirectional.centerEnd, [Color(0x00000000),
    I/flutter ( 4983):   Color(0x04000000), Color(0x12000000), Color(0x38000000)], [0.0, 0.3, 0.6, 1.0], TileMode.clamp)))
    I/flutter ( 4983):   FractionalTranslation
    I/flutter ( 4983):   SlideTransition(animation: AnimationController#22083(⏭ 1.000; paused; for
    I/flutter ( 4983):   CupertinoPageRoute<dynamic>(/))➩ProxyAnimation➩Cubic(0.35, 0.91, 0.33, 0.97)ₒₙ/Cubic(0.67, 0.03,
    I/flutter ( 4983):   0.65, 0.09)➩Tween<Offset>(Offset(1.0, 0.0) → Offset(0.0, 0.0))➩Offset(0.0, 0.0))
    I/flutter ( 4983):   FractionalTranslation
    I/flutter ( 4983):   SlideTransition(animation: kAlwaysDismissedAnimation➩ProxyAnimation➩ProxyAnimation➩Cubic(0.35,
    I/flutter ( 4983):   0.91, 0.33, 0.97)ₒₙ/Cubic(0.67, 0.03, 0.65, 0.09)➩Tween<Offset>(Offset(0.0, 0.0) → Offset(-0.3,
    I/flutter ( 4983):   0.0))➩Offset(0.0, 0.0))
    I/flutter ( 4983):   CupertinoPageTransition
    I/flutter ( 4983):   AnimatedBuilder(animation: Listenable.merge([AnimationController#22083(⏭ 1.000; paused; for
    I/flutter ( 4983):   CupertinoPageRoute<dynamic>(/))➩ProxyAnimation,
    I/flutter ( 4983):   kAlwaysDismissedAnimation➩ProxyAnimation➩ProxyAnimation]))
    I/flutter ( 4983):   RepaintBoundary
    I/flutter ( 4983):   _FocusScopeMarker
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   FocusScope
    I/flutter ( 4983):   PageStorage
    I/flutter ( 4983):   Offstage(offstage: false)
    I/flutter ( 4983):   _ModalScopeStatus(active)
    I/flutter ( 4983):   _ModalScope<dynamic>-[LabeledGlobalKey<_ModalScopeState<dynamic>>#ad37d]
    I/flutter ( 4983):   _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#21cdc]
    I/flutter ( 4983):   Stack(alignment: AlignmentDirectional.topStart, fit: expand, overflow: clip)
    I/flutter ( 4983):   _Theatre
    I/flutter ( 4983):   Overlay-[LabeledGlobalKey<OverlayState>#a733e]
    I/flutter ( 4983):   _FocusScopeMarker
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   FocusScope
    I/flutter ( 4983):   AbsorbPointer(absorbing: false)
    I/flutter ( 4983):   Listener(listeners: [down, up, cancel], behavior: deferToChild)
    I/flutter ( 4983):   Navigator
    I/flutter ( 4983):   CupertinoTabView
    I/flutter ( 4983):   _FocusScopeMarker
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   FocusScope
    I/flutter ( 4983):   TickerMode(mode: enabled)
    I/flutter ( 4983):   Offstage(offstage: false)
    I/flutter ( 4983):   Stack(alignment: AlignmentDirectional.topStart, fit: expand, overflow: clip)
    I/flutter ( 4983):   _TabSwitchingView
    I/flutter ( 4983):   Padding(padding: EdgeInsets.zero)
    I/flutter ( 4983):   Padding(padding: EdgeInsets(0.0, 0.0, 0.0, 50.0))
    I/flutter ( 4983):   MediaQuery(MediaQueryData(size: Size(411.4, 683.4), devicePixelRatio: 2.6, textScaleFactor: 1.0,
    I/flutter ( 4983):   platformBrightness: Brightness.light, padding: EdgeInsets(0.0, 24.0, 0.0, 0.0), viewInsets:
    I/flutter ( 4983):   EdgeInsets.zero, alwaysUse24HourFormat: true, accessibleNavigation: falsedisableAnimations:
    I/flutter ( 4983):   falseinvertColors: falseboldText: false))
    I/flutter ( 4983):   Stack(alignment: AlignmentDirectional.topStart, fit: loose, overflow: clip)
    I/flutter ( 4983):   DecoratedBox(bg: BoxDecoration(color: Color(0xff006688)))
    I/flutter ( 4983):   CupertinoTabScaffold
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   Builder
    I/flutter ( 4983):   RepaintBoundary-[GlobalKey#2f9df]
    I/flutter ( 4983):   IgnorePointer(ignoring: false)
    I/flutter ( 4983):   Stack(alignment: AlignmentDirectional.topStart, fit: passthrough, overflow: clip)
    I/flutter ( 4983):   _CupertinoBackGestureDetector<dynamic>
    I/flutter ( 4983):   DecoratedBox(bg: _CupertinoEdgeShadowDecoration(edgeGradient:
    I/flutter ( 4983):   LinearGradient(AlignmentDirectional(0.9, 0.0), AlignmentDirectional.centerEnd, [Color(0x00000000),
    I/flutter ( 4983):   Color(0x04000000), Color(0x12000000), Color(0x38000000)], [0.0, 0.3, 0.6, 1.0], TileMode.clamp)))
    I/flutter ( 4983):   DecoratedBoxTransition(animation: AnimationController#07db9(⏭ 1.000; paused; for
    I/flutter ( 4983):   CupertinoPageRoute<dynamic>(/))➩ProxyAnimation➩Cubic(0.35, 0.91, 0.33,
    I/flutter ( 4983):   0.97)➩DecorationTween(_CupertinoEdgeShadowDecoration(edgeGradient: null) →
    I/flutter ( 4983):   _CupertinoEdgeShadowDecoration(edgeGradient: LinearGradient(AlignmentDirectional(0.9, 0.0),
    I/flutter ( 4983):   AlignmentDirectional.centerEnd, [Color(0x00000000), Color(0x04000000), Color(0x12000000),
    I/flutter ( 4983):   Color(0x38000000)], [0.0, 0.3, 0.6, 1.0],
    I/flutter ( 4983):   TileMode.clamp)))➩_CupertinoEdgeShadowDecoration(edgeGradient:
    I/flutter ( 4983):   LinearGradient(AlignmentDirectional(0.9, 0.0), AlignmentDirectional.centerEnd, [Color(0x00000000),
    I/flutter ( 4983):   Color(0x04000000), Color(0x12000000), Color(0x38000000)], [0.0, 0.3, 0.6, 1.0], TileMode.clamp)))
    I/flutter ( 4983):   FractionalTranslation
    I/flutter ( 4983):   SlideTransition(animation: AnimationController#07db9(⏭ 1.000; paused; for
    I/flutter ( 4983):   CupertinoPageRoute<dynamic>(/))➩ProxyAnimation➩Cubic(0.35, 0.91, 0.33, 0.97)ₒₙ/Cubic(0.67, 0.03,
    I/flutter ( 4983):   0.65, 0.09)➩Tween<Offset>(Offset(1.0, 0.0) → Offset(0.0, 0.0))➩Offset(0.0, 0.0))
    I/flutter ( 4983):   FractionalTranslation
    I/flutter ( 4983):   SlideTransition(animation: kAlwaysDismissedAnimation➩ProxyAnimation➩ProxyAnimation➩Cubic(0.35,
    I/flutter ( 4983):   0.91, 0.33, 0.97)ₒₙ/Cubic(0.67, 0.03, 0.65, 0.09)➩Tween<Offset>(Offset(0.0, 0.0) → Offset(-0.3,
    I/flutter ( 4983):   0.0))➩Offset(0.0, 0.0))
    I/flutter ( 4983):   CupertinoPageTransition
    I/flutter ( 4983):   AnimatedBuilder(animation: Listenable.merge([AnimationController#07db9(⏭ 1.000; paused; for
    I/flutter ( 4983):   CupertinoPageRoute<dynamic>(/))➩ProxyAnimation,
    I/flutter ( 4983):   kAlwaysDismissedAnimation➩ProxyAnimation➩ProxyAnimation]))
    I/flutter ( 4983):   RepaintBoundary
    I/flutter ( 4983):   _FocusScopeMarker
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   FocusScope
    I/flutter ( 4983):   PageStorage
    I/flutter ( 4983):   Offstage(offstage: false)
    I/flutter ( 4983):   _ModalScopeStatus(active)
    I/flutter ( 4983):   _ModalScope<dynamic>-[LabeledGlobalKey<_ModalScopeState<dynamic>>#0ca68]
    I/flutter ( 4983):   _OverlayEntry-[LabeledGlobalKey<_OverlayEntryState>#f9cc9]
    I/flutter ( 4983):   Stack(alignment: AlignmentDirectional.topStart, fit: expand, overflow: clip)
    I/flutter ( 4983):   _Theatre
    I/flutter ( 4983):   Overlay-[LabeledGlobalKey<OverlayState>#fb0a7]
    I/flutter ( 4983):   _FocusScopeMarker
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   hintOverrides: null)
    I/flutter ( 4983):   FocusScope
    I/flutter ( 4983):   AbsorbPointer(absorbing: false)
    I/flutter ( 4983):   Listener(listeners: [down, up, cancel], behavior: deferToChild)
    I/flutter ( 4983):   Navigator-[GlobalObjectKey<NavigatorState> _WidgetsAppState#693fd]
    I/flutter ( 4983):   DefaultTextStyle(inherit: true, color: Color(0xffffffff), size: 17.0, softWrap: wrapping at box
    I/flutter ( 4983):   width, overflow: clip)
    I/flutter ( 4983):   CustomPaint
    I/flutter ( 4983):   Banner("DEBUG", textDirection: ltr, location: topEnd, Color(0xa0b71c1c), text inherit: true, text
    I/flutter ( 4983):   color: Color(0xffffffff), text size: 10.2, text weight: 900, text height: 1.0x)
    I/flutter ( 4983):   CheckedModeBanner("DEBUG")
    I/flutter ( 4983):   Title(title: "Papierkram.de TimeTracker", color: Color(0xff007aff))
    I/flutter ( 4983):   Directionality(textDirection: ltr)
    I/flutter ( 4983):   _LocalizationsScope-[GlobalKey#2249c]
    I/flutter ( 4983):   Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null,
    I/flutter ( 4983):   textDirection: ltr, hintOverrides: null)
    I/flutter ( 4983):   Localizations(locale: en_US, delegates: [DefaultCupertinoLocalizations.delegate(en_US),
    I/flutter ( 4983):   DefaultWidgetsLocalizations.delegate(en_US)])
    I/flutter ( 4983):   MediaQuery(MediaQueryData(size: Size(411.4, 683.4), devicePixelRatio: 2.6, textScaleFactor: 1.0,
    I/flutter ( 4983):   platformBrightness: Brightness.light, padding: EdgeInsets(0.0, 24.0, 0.0, 0.0), viewInsets:
    I/flutter ( 4983):   EdgeInsets.zero, alwaysUse24HourFormat: true, accessibleNavigation: falsedisableAnimations:
    I/flutter ( 4983):   falseinvertColors: falseboldText: false))
    I/flutter ( 4983):   WidgetsApp-[GlobalObjectKey _CupertinoAppState#d5234]
    I/flutter ( 4983):   CupertinoTheme
    I/flutter ( 4983):   ScrollConfiguration(behavior: _AlwaysCupertinoScrollBehavior)
    I/flutter ( 4983):   CupertinoApp
    I/flutter ( 4983):   MyApp
    I/flutter ( 4983):   [root]
    I/flutter ( 4983): 
    I/flutter ( 4983): When the exception was thrown, this was the stack:
    I/flutter ( 4983): #0      debugCheckHasMaterial.<anonymous closure> (package:flutter/src/material/debug.dart:64:7)
    I/flutter ( 4983): #1      debugCheckHasMaterial (package:flutter/src/material/debug.dart:67:4)
    I/flutter ( 4983): #2      _TextFieldState.build (package:flutter/src/material/text_field.dart:740:12)
    I/flutter ( 4983): #3      StatefulElement.build (package:flutter/src/widgets/framework.dart:3825:27)
    I/flutter ( 4983): #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3736:15)
    I/flutter ( 4983): #5      Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
    I/flutter ( 4983): #6      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
    I/flutter ( 4983): #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3864:11)
    I/flutter ( 4983): #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
    I/flutter ( 4983): #9      Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #10     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #11     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
    I/flutter ( 4983): #12     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #13     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #14     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
    I/flutter ( 4983): #15     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
    I/flutter ( 4983): #16     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
    I/flutter ( 4983): #17     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3864:11)
    D/skia    ( 4983): Program linking failed.
    I/flutter ( 4983): #18     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
    I/flutter ( 4983): #19     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #20     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #21     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
    I/flutter ( 4983): #22     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #23     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #24     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
    I/flutter ( 4983): #25     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #26     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #27     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4876:14)
    I/flutter ( 4983): #28     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #29     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #30     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
    I/flutter ( 4983): #31     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
    I/flutter ( 4983): #32     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
    I/flutter ( 4983): #33     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
    I/flutter ( 4983): #34     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #35     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
    I/flutter ( 4983): #37     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
    I/flutter ( 4983): #38     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
    I/flutter ( 4983): #39     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
    I/flutter ( 4983): #40     ParentDataElement.mount (package:flutter/src/widgets/framework.dart:4063:11)
    I/flutter ( 4983): #41     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #42     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #43     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3747:16)
    I/flutter ( 4983): #44     Element.rebuild (package:flutter/src/widgets/framework.dart:3559:5)
    I/flutter ( 4983): #45     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3716:5)
    I/flutter ( 4983): #46     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3864:11)
    I/flutter ( 4983): #47     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3711:5)
    I/flutter ( 4983): #48     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2956:14)
    I/flutter ( 4983): #49     Element.updateChild (package:flutter/src/widgets/framework.dart:2759:12)
    I/flutter ( 4983): #50     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1030:36)
    I/flutter ( 4983): #51     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1015:20)
    I/flutter ( 4983): #52     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2253:19)
    I/flutter ( 4983): #53     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1008:11)
    I/flutter ( 4983): #54     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:274:23)
    I/flutter ( 4983): #55     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1728:58)
    I/flutter ( 4983): #56     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:797:15)
    I/flutter ( 4983): #57     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1728:13)
    I/flutter ( 4983): #58     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:263:5)
    I/flutter ( 4983): #59     RenderSliverMultiBoxAdaptor.insertAndLayoutChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:407:5)
    I/flutter ( 4983): #60     RenderSliverList.performLayout.advance (package:flutter/src/rendering/sliver_list.dart:190:19)
    I/flutter ( 4983): #61     RenderSliverList.performLayout (package:flutter/src/rendering/sliver_list.dart:233:19)
    I/flutter ( 4983): #62     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #63     RenderSliverPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:182:11)
    I/flutter ( 4983): #64     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #65     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:407:13)
    I/flutter ( 4983): #66     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1322:12)
    I/flutter ( 4983): #67     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1240:20)
    I/flutter ( 4983): #68     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #69     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #70     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #71     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #72     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #73     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #74     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #75     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #76     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #77     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #78     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #79     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #80     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #81     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #82     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #83     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #84     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #85     RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
    I/flutter ( 4983): #86     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #87     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #88     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #89     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #90     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #91     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #92     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #93     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #94     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #95     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #96     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #97     _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #98     RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3032:13)
    I/flutter ( 4983): #99     RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #100    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
    I/flutter ( 4983): #101    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #102    __RenderTheatre&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #103    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #104    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #105    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #106    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #107    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #108    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #109    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #110    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #111    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #112    _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:105:13)
    I/flutter ( 4983): #113    RenderOffstage.performLayout (package:flutter/src/rendering/proxy_box.dart:3032:13)
    I/flutter ( 4983): #114    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #115    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
    I/flutter ( 4983): #116    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #117    RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:199:11)
    I/flutter ( 4983): #118    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #119    RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:199:11)
    I/flutter ( 4983): #120    RenderObject.layout (package:flutter/src/rendering/object.dart:1632:7)
    I/flutter ( 4983): #121    RenderStack.performLayout (package:flutter/src/rendering/stack.dart:510:15)
    I/flutter ( 4983): #122    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1507:7)
    I/flutter ( 4983): #123    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:766:18)
    I/flutter ( 4983): #124    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:329:19)
    I/flutter ( 4983): #125    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:701:13)
    I/flutter ( 4983): #126    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&SemanticsBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:268:5)
    I/flutter ( 4983): #127    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:988:15)
    I/flutter ( 4983): #128    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:928:9)
    I/flutter ( 4983): #129    _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:840:5)
    I/flutter ( 4983): #133    _invoke (dart:ui/hooks.dart:209:10)
    I/flutter ( 4983): #134    _drawFrame (dart:ui/hooks.dart:168:3)
    I/flutter ( 4983): (elided 3 frames from package dart:async)
    I/flutter ( 4983): ════════════════════════════════════════════════════════════════════════════════════════════════════
    I/flutter ( 4983): Another exception was thrown: No Material widget found.
    
    
    opened by SimonIT 11
  • A bunch of fixes and hide suggestions box on keyboard hide

    A bunch of fixes and hide suggestions box on keyboard hide

    Fixes #62 , #63 , #48 .

    Alright, so the width now auto resizes correctly on orientation change. The findRenderObject method call was being called prematurely. Moved it so now it works.

    For AxisDirection.Up, you will most likely use this when the text box is at the bottom right? So chances are the keyboard will obscure part of the list. Now the suggestion box starts just above the keyboard so your users can see the full list.

    Used 3rd party library for suggestions hiding on keyboard hide. Props to adee42 for making a good library. Works great! Added property hideSuggestionsOnKeyboardHide in case anyone hates this new functionality (can't think of why).

    Someone should double-check my work just to make sure I didn't break stuff. Moved quite a bit of code around.

    opened by KaYBlitZ 11
  • Option to keep suggestion box

    Option to keep suggestion box "as is" until loading is done?

    Maybe I'm doing something wrong, but when testing with suggestions that take only 100 ms to load, the box disappears and reappears, even with

    animationStart: 1,
    animationDuration: Duration(microseconds: 0),
    
    

    IMHO it would look much nicer if the current suggestions would stay until new ones are loaded. Would it make sense to have an option (or set a duration) for not updating the suggestion box at all until new suggestions are loaded?

    opened by magnus-lpa 11
  • Make SuggestionBox can be on top of TextField.

    Make SuggestionBox can be on top of TextField.

    Is there any way to put the SuggestionBox above TextField? Because now my situation is that the input method will block the SuggestionBox, so I want to make the SuggestionBox above the TextField.

    opened by yohom 11
  • Expected 0 type arguments

    Expected 0 type arguments

    Getting this issue since this morning:

    /C:/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_form_builder-4.1.0/lib/src/fields/form_builder_typeahead.dart:184:9: Error: Expected 0 type arguments. final TextFieldConfiguration<T> textFieldConfiguration; ^

    in the fomr builder plugin depended on flutter typehead.

    This is most likely caused by the 1.9.2 update, as adding and fixing the plugin to "<=1.9.1" in pubspec.yaml fixes the issue. Is it possible to look into it?

    opened by Silfalion 10
  • On smaller devices -- keyboard obscures suggestions and doesn't scroll

    On smaller devices -- keyboard obscures suggestions and doesn't scroll

    This is a great widget. Our issue is that on smaller devices (specifically for us a user has an iPhone SE) and the initial suggestions comes up -- but when they tap in the box and the keyboard pops up -- the bottom of the list is obscured by the keyboard and scrolling doesn't "work". Meaning, it doesn't actually scroll it scrolls then pops back ... probably because it's confused that the text isn't visible by the keyboard?

    Any workaround to this?

    Also -- the "Done" button on iOS removes the keyboard, but also the scroll list and everything else -- so that didn't help :(

    This is rather important for our users.. hoping for some ideas @AbdulRahmanAlHamali

    opened by sjmcdowall 10
  • Scrollable.of() was called with a context that does not contain a Scrollable widget

    Scrollable.of() was called with a context that does not contain a Scrollable widget

    currently using typeAhead widget to query some parameters, after the recent flutter 3 update i keep getting this error

    Scrollable.of() was called with a context that does not contain a Scrollable widget. This is the widget where the error is pointing

     Row(
        children: [
            Image.asset("images/images/desticon.png",
                height: 16.0, width: 16.0),
            SizedBox(width: 18.0),
            Expanded(
                child: Container(
                    decoration: BoxDecoration(
                        color: Colors.grey[400],
                        borderRadius: BorderRadius.circular(5.0),
                    ),
                    child: Padding(
                        padding: EdgeInsets.all(3.0),
                        child: TypeAheadField(
                            textFieldConfiguration: TextFieldConfiguration(
                                autofocus: false,
                                maxLines: 1,
                                controller: dropOffTextEditingController,
                                decoration: InputDecoration(
                                    contentPadding: EdgeInsets.all(3),
                                    hintText: "Drop off Location",
                                    labelStyle: TextStyle(color: Colors.black),
                                    focusedBorder: OutlineInputBorder(
                                        borderSide: BorderSide(
                                            width: 1.3, color: Colors.black),
                                    ),
                                    border: OutlineInputBorder(
                                        borderSide: BorderSide(width: 0.8),
                                    ),
                                ),
                            ),
                            suggestionsCallback: (pattern) async {
                                //if (pattern.isNotEmpty)
                                return await addressSuggestion(pattern);
                                // return Future.value();
                            },
                            suggestionsBoxController:
                            SuggestionsBoxController(),
                            itemBuilder: (context, dynamic suggestion) {
                                return ListTile(
                                    leading: Icon(Icons.location_on),
                                    title: Text((suggestion as SearchInfo)
                                        .address!
                                        .name!),
                                    subtitle:
                                    Text((suggestion).address!.country!),
                                );
                            },
                            onSuggestionSelected: (dynamic suggestion) {
                                print("xxx $suggestion");
    
                                dropOffTextEditingController.text =
                                    (suggestion as SearchInfo).address!.name!;
                                Provider.of < AppData > (context, listen: false)
                                    .updateDropOffLocationAddress(
                                        dropOffTextEditingController.text);
                                //get the coordinates here
                                GeoPoint ? dropOffPoint = suggestion.point;
                                print("Coordinates :$dropOffPoint");
                                Provider.of < AppData > (context, listen: false)
                                    .updateDropOffGeoPoint(dropOffPoint);
    
                                // Navigator.pop(
                                //     context, widget.showMapFunction(false));
                            },
                        ),
                    ),
                ),
            ),
        ],
    ),
    

    and this is the full error stack

    ════════ Exception caught by widgets library ═══════════════════════════════════
    The following assertion was thrown building Container(bg: BoxDecoration(color: Color(0xffbdbdbd), borderRadius: BorderRadius.circular(5.0))):
    Scrollable.of() was called with a context that does not contain a Scrollable widget.
    
    No Scrollable widget ancestor could be found starting from the context that was passed to Scrollable.of(). This can happen because you are using a widget that looks for a Scrollable ancestor, but no such ancestor exists.
    The context used was:
      TypeAheadField<SearchInfo>(dirty, state: _TypeAheadFieldState<SearchInfo>#d5046(lifecycle state: initialized))
    The relevant error-causing widget was
    Container
    lib/AllScreens/searchScreen.dart:140
    When the exception was thrown, this was the stack
    #0      Scrollable.of.<anonymous closure>
    package:flutter/…/widgets/scrollable.dart:336
    #1      Scrollable.of
    package:flutter/…/widgets/scrollable.dart:348
    #2      _TypeAheadFieldState.didChangeDependencies (package:flutter_typeahead/src/flutter_typeahead.dart:871:51)
    

    How can I fix it ?

    opened by jesussmile 0
  • Fixed scrollable issue

    Fixed scrollable issue

    Fix for beta version of Flutter (currently 3.7)

    Issue was that Scrollable.of(context) throws an error, if you try to invoke it without having scrollable context in ancestors. Method maybeOf will fix this issue.

    opened by M1chlCZ 0
  • [Feature request] adding a boolean parameters to TypeAhead to always show noItemsFoundBuilder's return widget if has focus,  not only one time after the request finishes

    [Feature request] adding a boolean parameters to TypeAhead to always show noItemsFoundBuilder's return widget if has focus, not only one time after the request finishes

    In the absence of suggestions, there may be a scenario in which you need to have a widget appear that enables you to add current text as a new suggestion to the server. In this scenario, you need to have the noItemsFoundBuilder widget to be always shown when the textField has the focus not only be shown one time after the request finishes

    opened by shehabmohamed0 0
  • This package is very useful, please add a scroll controller for infinite scroll

    This package is very useful, please add a scroll controller for infinite scroll

    Please add the features listed in the title above, because these features in my opinion are very helpful...

    thank you very much in advance for making this pack

    opened by royhanrahim 0
Releases(1.1.0)
  • 1.1.0(Mar 4, 2019)

    This change hides the suggestion box if the user closes the keyboard. This behavior can be changed via an option (see README.md).

    Also fixes a bunch of keyboard sizing and misc. errors.

    Source code(tar.gz)
    Source code(zip)
Owner
Software Engineer Life-time Student
null
This Dart package offers developers a streamlined library of Flutter widgets, useful for expanding widgets and text views, when users interact with them.

This Dart package offers developers a streamlined library of Flutter widgets, useful for expanding widgets and text views, when users interact with them.

Jesús Rodríguez 44 Dec 6, 2022
A Flutter package that enables users to resize the internal widgets by dragging.

resizable_widget ResizableWidget enables users to resize the internal widgets by dragging. This package contains simple APIs, but if needed, you can c

null 35 Dec 2, 2022
A better way for new feature introduction and step-by-step users guide for your Flutter project.

A better way for new feature introduction and step-by-step users guide for your Flutter project.

好未来技术 139 Oct 26, 2022
A wrapper to show a scroll to top prompt to the user on scrollable widgets.

flutter_scroll_to_top A wrapper to show a scroll to top prompt to the user on scrollable widgets. Installing Add the following dependency to your pubs

Naman Shergill 11 May 16, 2022
With flutter tags you can create selectable or input tags that automatically adapt to the screen width

flutter_tags Create beautiful tags quickly and easily. Installing Add this to your package's pubspec.yaml file: dependencies: flutter_tags: "^0.4.9+

Antonino Di Natale 417 Dec 21, 2022
Flutter Widgets that you can touch and feel

Flutter widgets you haven't used yet. Problems that proximity solves Currently, Flutter has a lot of useful pre-built widgets, no, too many widgets. T

Masahiro Aoki 32 Nov 8, 2022
A flutter package to display a country, states, and cities. In addition it gives the possibility to select a list of countries, States and Cities depends on Selected, also you can search country, state, and city all around the world.

A flutter package to display a country, states, and cities. In addition it gives the possibility to select a list of countries, States and Cities depends on Selected, also you can search country, state, and city all around the world.

Altaf Razzaque 25 Dec 20, 2022
This package provides some widgets you can use to create a smooshy UI.

Dough Library Squishy widgets for Flutter. Quick Links Dough Demos Here are a few samples of the different widgets provided by this repo. You can find

Josiah Saunders 530 Dec 23, 2022
DirectSelect is a selection widget with an ethereal, full-screen modal popup displaying the available choices when the widget is interact with. https://dribbble.com/shots/3876250-DirectSelect-Dropdown-ux

direct-select-flutter DirectSelect is a selection widget with an ethereal, full-screen modal popup displaying the available choices when the widget is

null 582 Jan 4, 2023
A nice clean onboarding screen for your e-commerce app that can run both Andriod and iOS devices because it builds with flutter

A nice clean onboarding screen for your e-commerce app that can run both Andriod and iOS devices because it builds with flutter

null 23 Dec 4, 2022
A customizable segment tab control. Can be used with or without TabView.

A customizable segment tab control. Can be used with or without TabView. Features The package provides an advanced segmented control widget based on t

null 11 Nov 16, 2022
A flutter package to help you beautify your app popups.

flutter_beautiful_popup 中文 A flutter package to help you beautify your app popup, can be used in all platform.Live Demo. Preview: Getting Started Add

朱嘉伟 568 Dec 30, 2022
A simple package that provides you with some widgets and cutom clippers which implements the shape of a coupon card.

Coupon UI Kit A simple package that provides you with some widgets and cutom clippers which implements the shape of a coupon card. The example contain

AbdulMuaz Aqeel 15 Dec 20, 2022
Fluid layouts allows you to create responsive layout for mobile, web and desktop from a single codebase.

Fluid layout aims to help building a responsive experience through all the different screen sizes. Based in the boostrap approach, FluidLayout calculates a padding content (fluid_padding) that changes depending on the parent size. The Fluid widget uses that padding to set its size

Jaime Blasco 3 Jan 10, 2022
A simple animated radial menu widget for Flutter.

flutter_radial_menu A radial menu widget for Flutter. . Installation Install the latest version from pub. Quick Start Import the package, create a Rad

Victor Choueiri 434 Jan 7, 2023
Custom widget for Flutter

Flushbar Use this package if you need more customization when notifying your user. For Android developers, it is made to substitute toasts and snackba

Andre Haueisen 899 Dec 30, 2022
flutter stepper_touch widget

stepper_touch the concept of the widget inspired from Nikolay Kuchkarov. i extended the functionality to be more useful in real world applications Tha

Raouf Rahiche 271 Dec 30, 2022
A highly customisable Flutter widget for entering pin code. Suitable for use cases such as login and OTP.

pin_code_text_field It's a beautiful and highly customizable Flutter widget for entering pin code. Suitable for use cases such as login and OTP. Usage

Liew Jun Tung 309 Dec 28, 2022
Flutter FoldingCell widget

Simple FoldingCell widget Simple folding cell widget, pass frontWidget and innerWidget to fold and unfold. Installation Add dependency in pubspec.yaml

Farrukh 513 Dec 30, 2022