如何在 StatefulWidget 中显示本地字符串?
How to show local string in StatefulWidget?
我已经学习了如何通过 StatelessWidget 使用 i18n 进行 flutter 练习,
但仍然无法通过 StatefulWidget 工作。
我可以简单地替换下面的代码
title: new Text(S.of(context).title)
使用常量字符串,例如:
title: const Text("A Test Title");
所以我认为其他一切都应该没问题。唯一的问题是 i18n 不起作用。
有人能帮帮我吗,"How to use i18n via StatefulWidget on flutter ?"
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'generated/i18n.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
MyApp({Key key, this.title}) : super(key: key);
final String title;
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
BuildContext c;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
var tiles = new List<Widget>();
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: new Text(S.of(context).title), // Here is the problem
),
body: new Stack(
children: <Widget>[
new Container(),
new ListView(
children: tiles,
)
],
),
),
localizationsDelegates: [S.delegate],
supportedLocales: S.delegate.supportedLocales,
localeResolutionCallback: S.delegate.resolution(
fallback: new Locale("en", "")
),
);
}
}
您使用的 context
没有 MaterialApp
作为 parent。相反,它有一个 MaterialApp
作为 child.
问题是,您尝试使用 S.of(context)
获取的 S
实例存储在 MaterialApp
中。因此错误。
您可以改为使用不同的 context
,其中 context
在其 parent 中包含 MaterialApp
。
实现此目的的最简单方法是将应用的一部分包装到 Builder
中。
类似于:
return MaterialApp(
home: Builder(
builder: (context) {
const title = S.of(context).title; // works now because the context used has a MaterialApp inside its parents
return Scaffold(...);
}
)
)
我已经学习了如何通过 StatelessWidget 使用 i18n 进行 flutter 练习, 但仍然无法通过 StatefulWidget 工作。
我可以简单地替换下面的代码
title: new Text(S.of(context).title)
使用常量字符串,例如:
title: const Text("A Test Title");
所以我认为其他一切都应该没问题。唯一的问题是 i18n 不起作用。
有人能帮帮我吗,"How to use i18n via StatefulWidget on flutter ?"
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'generated/i18n.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
MyApp({Key key, this.title}) : super(key: key);
final String title;
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
BuildContext c;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
var tiles = new List<Widget>();
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: new Text(S.of(context).title), // Here is the problem
),
body: new Stack(
children: <Widget>[
new Container(),
new ListView(
children: tiles,
)
],
),
),
localizationsDelegates: [S.delegate],
supportedLocales: S.delegate.supportedLocales,
localeResolutionCallback: S.delegate.resolution(
fallback: new Locale("en", "")
),
);
}
}
您使用的 context
没有 MaterialApp
作为 parent。相反,它有一个 MaterialApp
作为 child.
问题是,您尝试使用 S.of(context)
获取的 S
实例存储在 MaterialApp
中。因此错误。
您可以改为使用不同的 context
,其中 context
在其 parent 中包含 MaterialApp
。
实现此目的的最简单方法是将应用的一部分包装到 Builder
中。
类似于:
return MaterialApp(
home: Builder(
builder: (context) {
const title = S.of(context).title; // works now because the context used has a MaterialApp inside its parents
return Scaffold(...);
}
)
)