flutter - RenderBox 未布置:RenderPhysicalShape#47b25 relayoutBoundary=up2
问题描述
我InternationalPhoneNumberInput
用来接收用户登录,当我弹出国家代码选择 UI 时,它显示此错误:
════════ Exception caught by rendering library ═════════════════════════════════════════════════════
RenderBox was not laid out: RenderPhysicalShape#cfa17 relayoutBoundary=up2
'package:flutter/src/rendering/box.dart':
Failed assertion: line 1785 pos 12: 'hasSize'
The relevant error-causing widget was:
MaterialApp file:///home/dolphin/AndroidStudioProjects/Cruise/lib/src/widgets/CruiseApp.dart:26:12
这是我的InternationalPhoneNumberInput
控件代码(我将代码替换为官方演示但仍然有这个错误):
import 'package:cruise/src/common/global_style.dart';
import 'package:cruise/src/page/reg/reg.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:intl_phone_number_input/intl_phone_number_input.dart';
class LoginPage extends HookWidget {
final PhoneNumber number = PhoneNumber(isoCode: 'CN');
final TextEditingController controller = TextEditingController();
@override
Widget build(BuildContext context) {
final _formKey = useMemoized(() => GlobalKey<FormState>());
final username = useState("");
final password = useState("");
final phoneValid = useState(false);
final submitting = useState(false);
double screenWidth = MediaQuery.of(context).size.width;
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
final TextEditingController controller = TextEditingController();
String initialCountry = 'NG';
PhoneNumber number = PhoneNumber(isoCode: 'NG');
return Scaffold(
appBar: AppBar(
title: Text(""),
actions: [
TextButton(
style: GlobalStyle.textButtonStyle,
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => RegPage()));
},
child: Text("注册", style: TextStyle(fontSize: 16.0)),
),
],
),
body: Form(
key: _formKey,
child: Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InternationalPhoneNumberInput(
onInputChanged: (PhoneNumber number) {
print(number.phoneNumber);
},
onInputValidated: (bool value) {
print(value);
},
selectorConfig: SelectorConfig(
selectorType: PhoneInputSelectorType.BOTTOM_SHEET,
),
ignoreBlank: false,
autoValidateMode: AutovalidateMode.disabled,
selectorTextStyle: TextStyle(color: Colors.black),
initialValue: number,
textFieldController: controller,
formatInput: false,
keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true),
inputBorder: OutlineInputBorder(),
onSaved: (PhoneNumber number) {
print('On Saved: $number');
},
),
RaisedButton(
onPressed: () {
formKey.currentState!.validate();
},
child: Text('Validate'),
),
RaisedButton(
onPressed: () {
//getPhoneNumber('+15417543010');
},
child: Text('Update'),
),
RaisedButton(
onPressed: () {
//formKey.currentState.save();
},
child: Text('Save'),
),
],
),
),
));
}
}
我应该怎么做才能解决这个问题?这是依赖项:
intl_phone_number_input: 0.6.0
解决方案
您是否尝试使用 SingleChildScrollView 将其包装如下:
Padding(
//padding: const EdgeInsets.fromLTRB( 20.0, 120, 20.0, 40),
padding: const EdgeInsets.all( 2),
child:
SingleChildScrollView(child:
InternationalPhoneNumberInput(
onInputChanged: (PhoneNumber number) {
username.value = number.phoneNumber;
},
locale: "zh",
hintText: "手机号码",
errorMessage:"无效的手机号码",
onInputValidated: (bool value) {
phoneValid.value = value;
},
selectorConfig: SelectorConfig(
selectorType: PhoneInputSelectorType.BOTTOM_SHEET,
backgroundColor: Colors.black,
),
ignoreBlank: false,
autoValidateMode: AutovalidateMode.disabled,
selectorTextStyle: TextStyle(color: Colors.black),
initialValue: number,
textFieldController: controller,
inputBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(30.0),
),
inputDecoration: InputDecoration(
//fillColor: Colors.black,
),
),
),
)
这是 CruiseApp 的定义:
import 'package:Cruise/src/home/home_new.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:Cruise/src/common/theme.dart';
import 'package:Cruise/src/common/view_manager.dart';
class CruiseApp extends HookWidget {
const CruiseApp({@required this.theme, @required this.view});
final ThemeData theme;
final ViewType view;
@override
Widget build(BuildContext context) {
final themeManager = useProvider(themeProvider);
final viewManager = useProvider(viewProvider);
useMemoized(() {
// TODO: Right now this triggers a rebuild, so unfortunately you'll see a flash of default theme.
themeManager.setTheme(theme);
viewManager.setView(view);
});
final currentTheme = useProvider(themeProvider.state);
return MaterialApp(
title: 'Cruise',
theme: currentTheme,
routes: {
"home": (context) => HomeNew(),
},
home: HomeNew(),
);
}
}
推荐阅读
- html - ::after 伪使用父宽度而不是元素宽度进行基于百分比的定位
- python - while True 循环脚本停止运行,没有终止或抛出错误
- python - 计算来自同一列的时间戳值之间的差异
- c# - 如何在 Angular API 中接受 C# ObjectResult 或对象
- python - float32 变量如何包含小于 10^-18 的值?
- php - 如何获得我的插件 wordpress 选项的值?
- javascript - 如何用箭头在画布中移动对象?
- php - “如果(真)”是什么意思?
- c# - 存储过程 *with* 内部动态 SQL 与动态 SQL C# 相比有何优势?
- chocolatey - 从下载的 msi 生成 Chocolatey 校验和