我创建了一个 Flutter 页面,其中有一堆输入。我认为这是一团糟,让我们重构它并为每个输入创建一个新的有状态小部件。
这很好,除了数据需要在父小部件中,而且我很难理解如何将数据从新的子小部件传递回父小部件。
我发现了一些方法,你传入一个函数,只要有变化,你就通过该函数将数据传递给父级。
我已经阅读了有关集团模式的内容,但我不确定这是否是我所需要的。我只想要一个单例样式对象,当有新输入时,主小部件及其子部件都可以读取并更新子部件。
有人能解释一下 bloc 模式是否会帮助我解决这个问题,或者是否有另一种设计模式可以帮助我解决这个问题。
** 编辑
谢谢你们的好答案。我的新问题与提供者模式/库有关。
我创建了一些状态类如下(我替换了内容以尝试保持简单)
class State1 with ChangeNotifier{
String _s;
set s(String newS){
_s = newS;
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用 multiprovider 来传递它(在 init 中创建对象)
child: MultiProvider(
providers: [
ChangeNotifierProvider(builder: (context) => state1),
],
child: Stack(
alignment: Alignment.center,
children: stackChildren,
),
Run Code Online (Sandbox Code Playgroud)
然后使用子项widegets构建方法访问
state1Var = Provider.of<State1>(context);
Run Code Online (Sandbox Code Playgroud)
所有这些都很好用..
我的问题是当我开始使用导航推送时,我无法再访问状态。
onPressed: (() {
Navigator.push(
contextField,
MaterialPageRoute(builder: (context) => NewPage()),
);
}),
Run Code Online (Sandbox Code Playgroud)
当我收到此错误时
Could not find the correct Provider<State1> above this NewPage Widget...
Run Code Online (Sandbox Code Playgroud)
我确实设法使用它获得了它
Navigator.push(
context, …Run Code Online (Sandbox Code Playgroud) 我想知道如何使用 Angular 初始化 firebase 应用程序检查。
我正在使用 Angular Fire,但我不确定如何在使用任何服务之前初始化 Firebase 应用程序检查
文档有这个
在访问任何 Firebase 服务之前,将以下初始化代码添加到您的应用程序。
Run Code Online (Sandbox Code Playgroud)firebase.initializeApp({ // Your firebase configuration object }); const appCheck = firebase.appCheck(); // Pass your reCAPTCHA v3 site key (public key) to activate(). Make sure this // key is the counterpart to the secret key you set in the Firebase console. appCheck.activate('abcdefghijklmnopqrstuvwxy-1234567890abcd');
但这如何在应用程序模块中完成。目前我像这样导入角火
@NgModule({
declarations: [
...
],
imports: [
AngularFireModule.initializeApp(environment.firebaseConfig),
],
]
Run Code Online (Sandbox Code Playgroud)
更新:
我知道这可能还不是 Angular Fire 库的一部分,因为 firebase app-check 是多么新,但我注意到有一个本机 firebase 库 https://www.npmjs.com/package/@firebase/app-check
我很高兴使用它(例如,以某种方式覆盖本机 firebase js …
如果我在 initState() 中初始化一个观察者,例如
textController.addListener(textTypedListener);
Run Code Online (Sandbox Code Playgroud)
在处理文本控制器之前,我是否需要手动删除侦听器?或者 dispose 会自动处理这个问题。
例如。选项 1
@override
void dispose() {
textController.removeListener(textTypedListener);
textController.dispose();
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
选项 2
@override
void dispose() {
textController.dispose();
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
哪个最好?
非常感谢。
我正在使用具有以下属性的文本字段:
TextField(
controller: textController,
keyboardType: TextInputType.multiline,
maxLines: 4,
maxLength: 150,
),
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但我想知道如何防止用户输入中断行,这会导致文本字段的行数超过 maxLines (4)..
有没有办法将线路锁定在 4?例如
输入 1 \n \n \n 应该工作
但 1 \n \n \n \n \n \n 不应该被允许