Давайте решим это по частям.
Когда я пытаюсь ввести его вручную, FutureBuilder перезагружается, когда я вхожу и покидаю TextField.В чем причина?
Это происходит потому, что когда клавиатура показывает или скрывает структуру флаттера, вызывает метод build
вашего виджета, и это поведение по умолчанию является причиной, по которой ваш FutureBuilder
перезаписывается,Вам следует избегать вызова сетевых методов внутри build
метода, и я советую вам использовать шаблон BLoC для обработки состояния вашего виджета.
Моему будущему нужна строка, которая передается из другого маршрута.Посмотрите аргументы args = .... Есть идеи, как я могу получить это в initState?
Ну, если вам нужен экземпляр context
, чтобы получить этот String
, вы не можете получить доступ к текущему контексту внутриinitState
метод, потому что ваш виджет еще не полностью инициализирован.Простой способ решить эту проблему в вашем случае, но не лучший, это проверить, были ли данные уже получены из сети или нет.
Future _myNetworkFuture; // declare this as member of your stateWidgetClass
Widget build(BuildContext context){
final Arguments args = ModalRoute.of(context).settings.arguments;
var height = MediaQuery.of(context).size.height;
var width = MediaQuery.of(context).size.width;
// this line says if(_myNetworkFuture == null) do the thing.
_myNetworkFuture ??= getEverything(args.colName);
return ...
Flexible(flex: 5,
child: FutureBuilder(
future: _myNetworkFuture,
builder: (context, snapshot){
// ...
}
}
При таком подходе, когда среда флаттера вызывает метод build
, если вы уже получилиданные вы не загружаете данные снова.Но я действительно советую вам использовать шаблон BLoC в такой ситуации.